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串口接收数据长度不稳定问题

最近在做一个实时接收数据的项目,需要每2ms接收下位机发来的两帧数据,算是串口高速接收。 在使用的过程中,发现串口接收的数据长度不稳定,有时长有时短。 代码如下: connect(seri...
  • sinat_34156619
  • sinat_34156619
  • 2017年10月08日 21:31
  • 432

关于Qt5 SerialPort串口传输丢失数据问题。

什么是Qt5 serialPort? 虽然现在大多数的家用PC机上已经不提供RS232接口了。但是由于RS232串口操作简单、通讯可靠,在工业领域中仍然有大量的应用。Qt以前的版本中,没有提供官方的...
  • qq_23301703
  • qq_23301703
  • 2018年01月15日 20:06
  • 110

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

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

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

在QextSerialPort类上增加相关的方法。 方法1:事件触发接收消息。 void my_apps::OpenCom() {     myCom = new QextSerialPo...
  • freeman1975
  • freeman1975
  • 2015年07月10日 09:04
  • 950

QT5入门之23 -QT串口编程

QT5有专门的串口类: QSerialPort:提供访问串口的功能 QSerialPortInfo:提供系统中存在的串口的信息 具体使用方法: 1.在pro文件中加入: QT +=...
  • a379039233
  • a379039233
  • 2015年10月27日 18:07
  • 7417

Qt串口处理数据丢包问题

(1)问题说明 程序通过串口接收字节数组,转化为各种数据。但实际应用中发现这个接收程序丢失了很多包数据。 (2)程序结构: 1.将串口类的readyRead信号连接到自定义的readData函数 c...
  • qq_28093585
  • qq_28093585
  • 2017年12月29日 16:04
  • 81

微信为什么不丢消息?

58沈剑 架构师之路 上一章和大家分享了《http如何像tcp一样实时的收消息?》, 本章来聊一聊即时通讯(Instant Messaging,后简称im)消息的可靠投递。 一、报...
  • bingqingsuimeng
  • bingqingsuimeng
  • 2016年12月23日 14:52
  • 558

Qt5实现串口通信

qt实现串口通信示例 1.串口通信简介 串口通信是上下位机进行通信的一种常用的通信协议,大部分单片机中都有一到多个串口资源经过简单的配置就可以实现上下位机的通信,下图是串口通信协议中的一中形式。如果...
  • WAmani
  • WAmani
  • 2016年10月18日 15:01
  • 2739

STM32串口第一个字节丢失问题的分析过程

STM32 串口 发送 必须 先检测 状态,否则 第一个 字节 无法 发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功, 使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位...
  • kevinhg
  • kevinhg
  • 2014年11月10日 23:39
  • 14606

Kafka消息保证不丢失

Kafka消息保证生产的信息不丢失和重复消费问题 1)使用同步模式的时候,有3种状态保证消息被安全生产,在配置为1(只保证写入leader成功)的话,如果刚好leader partition挂了,数...
  • john2522
  • john2522
  • 2017年03月21日 22:35
  • 6219
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt串口为什么会丢消息包?
举报原因:
原因补充:

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