串口通讯中垃圾数据的处理
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);
}
}
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);
}
}
相关文章推荐
- 如何处理串口通讯数据重合与分批到达的问题
- 如何处理串口通讯数据重合与分批到达的问题 2
- Delphi:TComPort封装在DLL中,通讯时无法接收串口数据的解决办法
- 串口处理数据(接收、解析、回复、框架)
- iOS--蓝牙通讯/blutooth________向周边发数据________处理蓝牙发过来的数据
- 浮点数据在嵌入式串行通讯中的快速处理
- 5.C# 串口类处理上传传感器数据
- c#处理基于Modbus协议的串口通讯程序
- 遇到的问题(一):智能家居中WIFI模块设备在接收底层家具设备串口数据时由于断帧而出现的指令丢失的情况处理
- Qt从零开始制作串口调试助手-(第十章、串口接收数据处理)-Creator_Ly
- c# 串口所有数据接收 到串口的数据全部处理
- C#中请问如何在串口通讯中接收输出HEX格式数据
- C++ builder 多进程串口2 数据的存储和处理。
- stm8s 串口通讯源码程序(8位数据,奇校验,2个停止位)
- C#用串口接收事件接不全数据的处理
- 归档处理即时通讯数据 LCS存档服务
- 串口如何接收数据,接收到又如何处理
- 串口通讯奇偶校验位的设置导致数据错误
- 【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动
- 【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动