在博客园首页看到一篇文章说使用缓存机制来处理串口收到的数据,这种机制处理,问题非常多,而且难于控制。实际上处理各种类型的通信数据专业而又简易的做法都是使用状态机对通信报文进行处理,而且使用状态机进行处理的话,可以有很多的定制扩展性,维护性更高,代码更清晰易读。
比如,一个经过设计的数据报文格式,最简单的情况下一般都是有同步头,控制字,数据,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;
}
}
}
整个结构非常清晰,并且易于维护,并且一个成熟的通信规约还包含的有字节超时等机制,交互式的通信仍然可以在这个结构基础上进行扩充,非常容易。不是吗?如果有高人有更好的方法,尽请告知,经验交流,不胜感激。