Qt串口通信,两个zigbee模块高速通信丢包问题 80C

通过usb转232数据线将两个zigbee模块和pc连接,然后在widows系统下用qt写出一个串口通信程序实现两个zigbee模块之间的通信,通信的数据也很简单例如312332.2123 21322.21231 21213.232 每一组都是数字和空格组成的 每一组中的数字个数也不多不超过20个。但是在高速通讯下会出现丢包,想通过在qt程序中加入crc校验等方法实现校准,但是验错之后怎么实现让发出端自动补发缺少的数据呢,各位大牛有什么方法吗,最好有类似的程序可以给我学习一下吗

4个回答

建议你先把你的程序跟串口工具连上进行一下测试,这样你可以确认问题是出在自己的程序上,还是设备上,以便进行修正。

abc_8489
abc_8489 不是,zigbee无限通讯在高频率下就会出现丢包问题,在低速都是没问题的。
一年多之前 回复

串口高速通信丢包是很正常的事情。
当然收发端程序也在很大程度上决定了何时才会丢包,丢包的频率等;但高速通信时,串口丢包是不可避免的。

言归正传,你的问题一般而言有两个方法:
方法一:一发一答法,效率不高,但很容易。常规设备通信协议基本都是这样。
即将报文改成,一发一答,答复完才会再发。如此基本就不存在判断的问题了,收到了错误应答或超时就直接重发就是了。
假如还需防止收方收到重复数据无法辨别,发送方可以加一个发送序列号即可。
发送序列号:每次发送后加一,但重复发送时使用原来的序列号。

方法二:错误应答法,效率高,但实现难度大些。电力行业的104协议就是此基础。
基本原理是:
建立发送序列号、接收序列号两个专门字段。
默认是无应答的,发送方不停发送,每次发送序列号加1。同时发送方保存已经发送的数据。
接收方不停的接收,每次接收成功一次,接收序列号加1。
当接收方发现接收错误时,如收到了跳跃的发送序列号,即接收方仅成功接收到了序列号5的数据,下一个数据成了序列号7的数据,则说明中间丢包了。
接收方侦测到错误时,通知发送方,同时附上接收成功的序列号。发送方此时需要重新发送在此之上的所有数据。

weixin_41986182
weixin_41986182 回复abc_8489: 第二种方法,你确定吗?!完整高效实现第二种方法,有很大的难度了。具体你可以看看电力行业的104协议基础。校验码很简单了,随便了求和、CRC都行了。
一年多之前 回复
abc_8489
abc_8489 我想的是第二种方法,对发送数据排序,先不管发送丢包,接收端先只对错误数据标记,然后通知发送端错误数据,再把对应序列数据重新发送。但是具体语言我想要参照,比如要校准肯定是要校准符的,是用crc算法,求和法还是什么,还有接收端的数据存放问题等等
一年多之前 回复

再说一点,串口收发,一般报文格式会如下设计:
1、包头:一般一个字节,一般选择在报文中最不可能出现的数据。 其目的是排除一些出错的数据,即在此之前的数据全部扔掉不要。对于排除错误数据而言很重要。
2、长度码:看情况,够用就行。其目的是防止接收时采用“字符间隔超时”这种结束方式,而是采用“达到接收长度”这种结束方式。对于效率而言很重要。
3、包尾:一般一个字节,标示报文结束。与2的目的一样。区别为,同步接收仅能采用2方式,异步接收2、3种方式任择其一即可。
4、校验码:串口通信本身没有纠错手段,所以使用校验码计算报文是否突变了,非常重要。一般使用CRC校验。
5、发送序列号:如需要接收方分别出重复发送的数据时,很有必要。一般两个字节,成功时加1,重复发送时不变,达到最大值后回滚。

abc_8489
abc_8489 好的,多谢,我仔细看看。
一年多之前 回复

哦,也就是说要做那种丢包重发的吧,协议可以参考modbus协议,是工业上用的比较多的协议,应该能够适应你这个需求。

phenix2009
白色一大坨 回复abc_8489: https://download.csdn.net/download/phenix2009/10360607这是我提供的modbus工具下载,你看下名字就行了,百度费点劲也能找到
一年多之前 回复
phenix2009
白色一大坨 简单说就是一个固定头、功能码、起始地址、长度、crc校验
一年多之前 回复
abc_8489
abc_8489 好的,多谢,我仔细看看。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问