您的位置:首页 > 其它

串口通讯中垃圾数据的处理

2017-03-07 18:35 232 查看
在双机串口通讯中,开关机(串口开闭)期间发送方有时候会发一些无效的垃圾数据,同时因为有的协议解析只有接收到一定数量才能解析。这就会出现一个现象:如果开头的数据是错误的,又没有及时丢弃,后面正确的数据接着位置存储,最终造成解析失败。现象就是有时候数据交互正确,有时候错误(冷启动第一次出现错误的几率较大)。所以串口通讯中对垃圾数据的防护及解析的顺序方法就显的很重要。

if(USART_GetITStatus(UART4,USART_IT_RXNE))
{
USART_ITConfig(UART4, USART_IT_RXNE, DISABLE);
Rbuff[rcnt++] =(char)USART_ReceiveData(UART4);/*读DR清0*/
if((rcnt >3)&&(rcnt >=Rbuff[1]))/**/
{
if((0X03 == Rbuff[2])&&(0X60 == Rbuff[3]))/*打印命令*/
{
if(rcnt==64)/*一个分包结束*/
{
Flag_IsPrtCmd = TRUE;
Cmdbuff_len = Rbuff[1];
if(Calculate_JiaoYan(Rbuff) ==Rbuff[Cmdbuff_len -1])
{

for(i=0;i<(Cmdbuff_len -5);i++)/*数据缓存*/
{
Sbuff[i]=Rbuff[i+4];
Rbuff[i]=0;
}
rcnt =0;
Flag_Uart4_Rcved =TRUE; /*串口接收到命令包*/
PrintDMA.pPrt = Sbuff;
PrintDMA.Prtsize =Cmdbuff_len-5;
Cmdbuff_len = 0;
}
}
}
else
{
Flag_IsPrtCmd = FALSE;
Cmdbuff_len = Rbuff[1];
for(i=0;i<Cmdbuff_len;i++)/*命令包缓存*/
{
Cmdbuff[i]=Rbuff[i];
Rbuff[i]=0;
}
rcnt=0;
Flag_Uart4_Rcved = 1; /*串口接收到命令包*/
}
}
else if(0x12!=Rbuff[0])/*垃圾数据的防护,若出现垃圾数据则覆盖重新接收*/
{
rcnt=0;
printf("Data err!\n");
}
USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: