zoukankan      html  css  js  c++  java
  • 串口通讯中垃圾数据的处理

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

    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! ");
            }
            USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
        }    

  • 相关阅读:
    html5-特殊符号的使用
    html5-表格
    html5-列表
    html5-绝对路径/相对路径
    html5-嵌入图片
    html5-超级链接
    html5-常用的文本元素
    html5-了解元素的属性
    Scanner类throwFor(Unknown Source)及跳过下一个扫描器分析
    有关HashMap的一些问题及解答
  • 原文地址:https://www.cnblogs.com/jieruishu/p/6516212.html
Copyright © 2011-2022 走看看