zoukankan      html  css  js  c++  java
  • 串口数据接收容错处理

    <<main.c>>

     

    串口数据接收,过长、过短、指令错误都返回超时1s后错误信息,

       

    /* USER CODE BEGIN Header */

    /**

    ******************************************************************************

    * @file : main.c

    * @brief : Main program body

    ******************************************************************************

    * @attention

    *

    * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.

    * All rights reserved.</center></h2>

    *

    * This software component is licensed by ST under BSD 3-Clause license,

    * the "License"; You may not use this file except in compliance with the

    * License. You may obtain a copy of the License at:

    * opensource.org/licenses/BSD-3-Clause

    *

    ******************************************************************************

    */

    /* USER CODE END Header */

    /* Includes ------------------------------------------------------------------*/

    #include "main.h"

       

    /* Private includes ----------------------------------------------------------*/

    /* USER CODE BEGIN Includes */

    #include <stdio.h>

    #include <math.h>

    #include "string.h"

    #include "gpio.h"

    #include "usart.h"

    #include "tim.h"

    #include "delay.h"

       

    /* USER CODE END Includes */

       

    /* Private typedef -----------------------------------------------------------*/

    /* USER CODE BEGIN PTD */

       

    /* USER CODE END PTD */

       

    /* Private define ------------------------------------------------------------*/

    /* USER CODE BEGIN PD */

    /* USER CODE END PD */

       

    /* Private macro -------------------------------------------------------------*/

    /* USER CODE BEGIN PM */

       

    /* USER CODE END PM */

       

    /* Private variables ---------------------------------------------------------*/

       

    /* USER CODE BEGIN PV */

    uint8_t UART_Buffer[1];                                                                        //串口临时接收

    uint8_t UART_Send[UART_BUFFERSIZE];                                                //串口数据发送

    uint8_t Recv_data[UART_BUFFERSIZE];                                                //串口数据接收

    uint8_t UART_SUM;                                                                                                                        //串口数据和校验计算

    uint8_t UART_Num = 0;

    uint8_t UART_Receive_Flag = 0;                                                                //串口接收状态,默认为0等待上位机发送命令

       

    uint16_t TIM6_timer_count = 0;                                                                //定时器6计数标记

    uint16_t TIM7_timer_count = 0;                                                                //定时器7计数标记

    uint8_t TIM6_timerFalg = 0;                                                                        //定时器6 1s标记

    uint8_t TIM7_timerFalg = 0;                                                                        //定时器7 1s标记

       

    /* USER CODE END PV */

       

    /* Private function prototypes -----------------------------------------------*/

    void SystemClock_Config(void);

       

    /* USER CODE BEGIN PFP */

    uint8_t messageFeedBack(uint8_t addr);                //串口1s反馈信息

    uint8_t UART_messageSend(void);        //串口信息反馈

       

    /* USER CODE END PFP */

       

    /* Private user code ---------------------------------------------------------*/

    /* USER CODE BEGIN 0 */

       

    /* USER CODE END 0 */

       

    /**

    * @brief The application entry point.

    * @retval int

    */

    int main(void)

    {

    //相关外设初始化

    /* USER CODE END 2 */

       

    /* Infinite loop */

    /* USER CODE BEGIN WHILE */

    while (1)

    {

    //串口收发检测、上报错误信息

    UART_messageSend();

    /* USER CODE END WHILE */

       

    /* USER CODE BEGIN 3 */

    }

       

    /* USER CODE END 3 */

    }

       

    /* USER CODE BEGIN 4 */

    uint8_t UART_messageSend(void)

    {

    if(TIM7_timerFalg == 1)                //串口信息接收超时1s,判为错误

    {

    TIM7_timerFalg = 0;

    HAL_TIM_Base_Stop_IT(&htim7);

       

    if(UART_Num < 45)

    {

    UART_Num = 0;

       

    for(int i = 0; i < UART_BUFFERSIZE; i++)         //清零

    {

    Recv_data[i] = 0;

    }

       

    UART_Receive_Flag = 0;                                                                                //串口接收出错

    UART_SUM = 0;

       

    //串口上报的错误信息

    HAL_UART_Transmit(&huart1, UART_Send, 5, 1000);

    }

    }

       

    if(UART_Num > 45)        //大于45个字节重新记数

    {

    UART_Num = 0;

    }

       

    if(get_WOLRD2ARM_BUF_RX_Value == 1 & UART_Receive_Flag == 1)                //WOLRD2ARM_BUF_RX引脚拉高、串口接收成功才发送反馈

    // if(UART_Receive_Flag == 1)

    {

    if(TIM6_timerFalg == 1)                //1s反馈一次

    {

    TIM6_timerFalg = 0;

    messageFeedBack(deviceAddress_Value);

    }

    }

       

    return 0;

    }

       

    uint8_t messageFeedBack(uint8_t addr)

    {

    //定时上报数据

    }

       

    /**

    * 函数功能: 串口接收完成回调函数

    * 输入参数: UartHandleUSART设备类型句柄

    */

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef* UartHandle)

    {

    //触发中断后,串口每次接收的字节数为1

    if(HAL_OK == HAL_UART_Receive_IT(&huart1, (uint8_t*)UART_Buffer, 1))

    {

    Recv_data[UART_Num] = UART_Buffer[0];

       

    if(UART_Num == 0)

    {

    TIM7_timerFalg = 0;

    HAL_TIM_Base_Start_IT(&htim7);

    }

       

    UART_Num++;

       

    if(UART_Num == 45)

    {

    if(Recv_data[44] == 0x8F & Recv_data[0] == 0x7F)

    {

    UART_Num = 0;

    TIM7_timerFalg = 0;

    HAL_TIM_Base_Stop_IT(&htim7);

       

    for (int i = 0; i < UART_BUFFERSIZE; i++)

    {

    if(i < 43)

    {

    UART_SUM = UART_SUM + Recv_data[i];

    }

    }

       

    if(Recv_data[0] == 0x7F & Recv_data[44] == 0x8F &

    Recv_data[43] == UART_SUM & Recv_data[2] == 0x28)        //桢头、帧尾、校验和、传输字节数

    {

    //数据接收正确处理

    }

    else

    {

    UART_Num = 0;

    HAL_TIM_Base_Start_IT(&htim7);

    }

    }

    else

    {

    UART_Num = 0;

    }

    }

    }

    }

       

    /**

    * 函数功能: 非阻塞模式下定时器的回调函数

    */

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

    {

    if (htim->Instance == htim6.Instance)

    {

    TIM6_timer_count++;

       

    if(TIM6_timer_count == 1000)                //1s

    {

    TIM6_timer_count = 0;

    TIM6_timerFalg = 1;

    //                                                printf("%d ", timerFalg);

    //                                                HAL_TIM_Base_Stop_IT(&htim6);

    }

    }

       

    if (htim->Instance == htim7.Instance)

    {

    TIM7_timer_count++;

       

    if(TIM7_timer_count == 1000)                //1s

    {

    TIM7_timer_count = 0;

    TIM7_timerFalg = 1;

    }

    }

    }

  • 相关阅读:
    crmfuxi
    段子
    wsfenxiang
    生成器、列表推导式
    闭包、迭代器、递归
    函数的参数及返回值
    嵌套、作用域、命名空间
    定义、函数的调用
    测试样式
    进制转换
  • 原文地址:https://www.cnblogs.com/ChengR/p/14611468.html
Copyright © 2011-2022 走看看