串口数据接收容错处理

<<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;

}

}

}

原文地址:https://www.cnblogs.com/ChengR/p/14611468.html