对于串口接收数据有丢包如何处理

问题:

假设发送一串数据过来,MCU进入中断接收数据,但是数据通讯由于外部干扰数据中断了,下一帧数据还要下发过来,我们需要判断把缓存数据也清除掉才可以

我想法是根据波特率计算每个字节传输的时间,在通讯接收做计时处理机制,当一接收到数据立即开启计时,当一直没收到包尾及数据长度相等,这是计时时间一到就要进行处理机制清楚缓存

void USART2_IRQHandler(void) { u8 res; if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据 { res =USART_ReceiveData(USART2); if((USART2_RX_STA&(1<<15))==0)//接收完的一批数据,若还没有被处理,则不再接收其他数据 { if(USART2_RX_STA<USART2_MAX_RECV_LEN) //还可以接收数据 { TIM_SetCounter(TIM5,0);/计数器清空 if(USART2_RX_STA==0) //使能定时器7的中断 { TIM_Cmd(TIM5,ENABLE);//使能定时器5 } USART2_RX_BUF[USART2_RX_STA++]=res; /记录接收到的值 }else { USART2_RX_STA|=1<<15; //强制标志接收完成 } } } }

void TIM5_IRQHandler(void) { if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) { USART2_RX_STA|=1<<15; TIM_ClearITPendingBit(TIM5, TIM_IT_Update ); TIM_Cmd(TIM5, DISABLE); } }

经验分享 程序员 微信小程序 职场和发展