串口设备死机了?
话说串口通信应该是非常稳,一对一交流,没有第三者,距离也不会太远,但是现在遇到了一个问题,通信异常了,只有下行的命令,没有返回,大有任你山风海啸我只当耳旁风的架势。非通信功能都可以正常操作。
千呼万唤始出来
既然有问题,那就找找吧。单机测试程序,测试了半天,一切正常的。那可能还是和客户端程序有关:1、发送了特殊数据,2、在特殊时间发送了数据。
监测通信数据,反复测试该设备A功能,也是正常的。。。。。。那只能在实际业务里测试了。这下不让人困惑了,通信异常了。
看了下通信数据,发现业务程序不仅仅把该设备A的数据发现了,还把其他设备B的数据也通过该串口往下发送一遍。出问题的节点是其他数据末尾数据为0x02。
设备A的数据格式是02 + 长度(数据长度,两字节表示) + 数据 + 03,其中长度和数据都是原始格式,比如有两个字节数据,长度部分就是00 02,十六进制形式。
由于设备B的最后一个字节0x02之后就是设备A的命令,其形式大概是这样的:02 02 len1 len2 xx xx xx xx 03。设备A就会把本来的长度信息len1 len2,判断成为02 len1(李逵变成了李鬼),就是大于512字节,但是后面没有这么多数据,就一直等着等着啊。表现就是通信异常。
解决方法
1、更改命令结构,把长度和数据部分都拆分,比如11,拆分成31 31。有点是不会出现数据混乱的情况,缺点是通信数据量加倍。
2、屏蔽不合理的长度信息。比如命令数据不会大于256字节,那长度的前一个字节始终为0,出现其他数据即为错误。比如:02 02,就会舍弃前一个02。缺点是只在长度信息比较特殊时使用。
3、检验命令字节之间的时间差,当时间差比价大时,判断命令结束,重新分析命令。缺点是需要添加计时程序。
4、大家来补充。
收获
设计指令格式时或是接收指令的程序时,需要考虑抗干扰能力。因为不是你一个人在工作。