zoukankan      html  css  js  c++  java
  • 通信协议的正确处理方法

      在博客园首页看到一篇文章说使用缓存机制来处理串口收到的数据,这种机制处理,问题非常多,而且难于控制。实际上处理各种类型的通信数据专业而又简易的做法都是使用状态机对通信报文进行处理,而且使用状态机进行处理的话,可以有很多的定制扩展性,维护性更高,代码更清晰易读。 

      比如,一个经过设计的数据报文格式,最简单的情况下一般都是有同步头,控制字,数据,CRC这样格式,对于这种格式,最简单的方式是:声明4个状态,

     enum State { Header, Control, Datas, CRC, } ;

     接下来,声明一个变量

     State state;

     用以记录当前的状态,然后在你的通信通道的接收数据方法中对收到的数据进行循环遍历

     for (int i = 0; i < buffer.Length; ++i)

     { 

      switch (state) 

      {

       case Header: 

        {

           //处理同步头 

          break;

         }

       case Control:

         { 

          //处理控制字

           break;

         }

       case Datas:

          {

           //处理数据

           break;

         }

       case CRC:

         {

           //验证CRC是否正确,如果不正确,并且报文设计了重发机制,那么就请求重发

           //如果CRC验证正确,那么触发事件,告知上层应用程序,可以处理整个报文信息了

           break;

         }

       }

     }

    整个结构非常清晰,并且易于维护,并且一个成熟的通信规约还包含的有字节超时等机制,交互式的通信仍然可以在这个结构基础上进行扩充,非常容易。不是吗?如果有高人有更好的方法,尽请告知,经验交流,不胜感激。

  • 相关阅读:
    Linq增删查改
    AspNetPager 分页显示
    简单C#数据库操作类
    SQL重复记录处理(查找,过滤,删除)
    Asp.Net配置Web.config连接数据库SqlServer
    转:Asp.Net网站项目发布到IIS后验证码不能显示的问题解决
    将一行含有日期范围的数据按照单日日期拆分
    asp.net过滤HTML标签的几个函数
    循环批量更新的的存储过程(属于转载)
    CheckBox的CheckedChanged事件获取所在GridView中的Cell值
  • 原文地址:https://www.cnblogs.com/CoolJie/p/1941588.html
Copyright © 2011-2022 走看看