李逵还是李鬼,串口接受数据也会遇到这样的问题吗?

本文描述了串口设备在通信中遇到的问题,即由于接收端误解读其他设备的数据导致死机。作者提供了四种可能的解决办法,包括改进命令结构、长度信息校验和时间差检测,强调在设计指令时要考虑抗干扰性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

李逵还是李鬼,串口接受数据也会遇到这样的问题吗?

串口设备死机了?

话说串口通信应该是非常稳,一对一交流,没有第三者,距离也不会太远,但是现在遇到了一个问题,通信异常了,只有下行的命令,没有返回,大有任你山风海啸我只当耳旁风的架势。非通信功能都可以正常操作。

千呼万唤始出来

既然有问题,那就找找吧。单机测试程序,测试了半天,一切正常的。那可能还是和客户端程序有关: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、大家来补充。

收获

设计指令格式时或是接收指令的程序时,需要考虑抗干扰能力。因为不是你一个人在工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值