随笔 - 733  文章 - 2  评论 - 12  阅读 - 92万

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

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

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);
    }    

posted on   杰瑞鼠  阅读(905)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示