通信协议的正确处理方法

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

  比如,一个经过设计的数据报文格式,最简单的情况下一般都是有同步头,控制字,数据,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;

     }

   }

 }

 

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

转载于:https://www.cnblogs.com/CoolJie/archive/2011/01/21/1941588.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值