使用定时器延时判断一帧完整的数据


由于GPS发送的一帧数据中间有间隔,造成不定长接收数据出现了不能接收完整帧的问题,从而使用定时器延时判断解决了该问题,主要代码如下:

 1 uint32_t buf_size    = 0;
 2 uint16_t TimerCount  = 0;
 3 uint8_t  TimerEnable = DISABLE;                               //定义定时器计数使能标志位
 4 
 5 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
 6 {
 7     //与GPS通信接口(RS232)
 8     if(USART1 == huart1.Instance)                             //判断是否是串口1
 9     {      
10         RxDMABuf_1[buf_size++]= aRxBuffer_1[0];               //将接收到的数据存入buf    
11         TimerCount=0;            
12         TimerEnable = ENABLE;                                 //置位定时器计数使能标志位
13         if(buf_size  >=  2048)
14         {
15             buf_size = 0;                                     //接收数据缓冲区溢出,重新开始接收
16             memset(RxDMABuf_1,0,2048);
17         }
18         HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer_1, 1);
19     }
20 }

定时器中添加判断处理

 1 void TIM3_IRQHandler(void)
 2 {    
 3     HAL_TIM_IRQHandler(&htim2);
 4     if(TimerEnable == ENABLE)
 5     {
 6         TimerCount++;
 7         if(TimerCount > 50)   //大于50ms,则判断为一帧数据接收完成
 8         {
 9             TimerCount = 0;
10             TimerEnable = DISABLE;
11             //此处为数据包处理逻辑
12             uint16_t buff_length = 0;
13         //-------------------------------------
14 
15         //-------------------------------------
16             buf_size = 0;
17         }
18     }      
19  }