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

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

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

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

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

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

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

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