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

在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,也一样重发。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草根大哥

进军大神程序员路上,谢谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值