使用定时器延时判断一帧完整的数据
由于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 }