Qt串口为什么会丢消息包?

原创 2015年07月10日 09:04:44
在QextSerialPort类上增加相关的方法。

方法1:事件触发接收消息。
void my_apps::OpenCom()
{
    myCom = new QextSerialPort(COM);
    connect(myCom, SIGNAL(readyRead()), this, SLOT(do_unpackage()));
    myCom->open(QIODevice::ReadWrite);
}
方法2:中断超时(定时轮询)来读取。
    Datatimer = new QTimer(this);
    connect(Datatimer,SIGNAL(timeout()),this,SLOT(do_unpackage()));
    Datatimer->setInterval(100);
    Datatimer->start();

丢消息的原因是串口是按byte stream方式传送的,必须要实现一个简单的链路层协议。否则无法保证一次接收完整的package,进而导致上层直接丢弃!

方案一:按frame发送和接收
发送侧,组帧来发送。每帧的组成:帧头+消息长度+内容+SUM字节。发送完成,等确认ACK。
接收侧,从buffer中寻找帧头,然后根据消息长度来取出内容,并计算SUM字节。如果帧头不对或SUM字节不对,回对方NAK。如果正确,回ACK。
一次定时任务,只处理一帧。如果这一帧没有收完,就等待一会儿(时间根据已接收部分估算时长)。如果接收了超过一帧数据,多余的数据取出来后,放在自己开的buffer中缓存。

方案二:按字节发送和接收
由imx6主控板来主动查询采集板是否有数据要上报。200ms poll一次。
主控板发poll cmd比如0x11给采集板,如果采集板有数据要报,就回0x11。否则不理会,主控板timeout后退出poll task。
如果有数据要报,则主控板进入停等协议,停下来等采集板发送长度字节,然后根据长度字节接收数据字节串。收完后,接收SUM字节,如果SUM字节和自己计算出来SUM字节相同,则回ACK。
否则回NAK,整个消息包重发。采集板超时收不到ACK或NAK,也一样重发。

版权声明:可自由转载。

Qt串口通信接收数据不完整的解决方法

在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况。因为串口数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串口读到起始标志时立即发送,并不...

CC2530 OSAL进入省电模式注意事项总结

在淘宝搞了几个CC2530模块回来玩,其中比较感兴趣的是低功耗这块功能,目前测试的结果是PM2模式下,纽扣电池2.8V电压,工作电流1.1uA(FLUKE F18B),符合规格书中描述的典型值1uA...

随感,有点乱

真理常常掌握在少数人手里,可有些人明明可以做少数人
  • Ropai
  • Ropai
  • 2014年05月18日 22:07
  • 741

Qt 仿微信弹窗消息Demo

  • 2017年12月01日 10:01
  • 4KB
  • 下载

单片机串口调试丢包验证过程记录_已解决

void main_form::remoteDataIncoming() //QSocketNotifier监测到出口有数据读就自动调用该函数(一般不会丢数据) { u_char a; ...
  • kangear
  • kangear
  • 2012年10月23日 19:43
  • 6408

qt在windows环境下截取消息

  • 2017年06月14日 11:33
  • 15.53MB
  • 下载

Qt 应用Redis 实现消息队列

  • 2017年11月03日 14:50
  • 38KB
  • 下载

IMX6 Linux系统下串口丢包错包问题研究

IMX6 Linux系统下串口丢包错包问题研究IMX6芯片简介摘自互联网 http://www.ic72.com/ZhanHui/2013-02-01/209182.html 1. IMX6 so...
  • fff_ylg
  • fff_ylg
  • 2017年04月20日 10:31
  • 844
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt串口为什么会丢消息包?
举报原因:
原因补充:

(最多只允许输入30个字)