串口数据接收不完整解决

项目场景:

基于QT开发串口调试工具,向JEM5396应用板发送寄存器读写命令


问题描述

使用QSerialPort类读取串口消息时,有时候会出现接收不全的现象,一条数据会发生多次接收的情况。可能是因为数据还未完全到达或者接收速度过快导致数据丢失。具体情况如下图:
在这里插入图片描述

理想的接收情况:

在这里插入图片描述


原因分析:

  • 由于下位机中的程序没有设置标志位和或者定界符,导致接收方不知道数据发送的起始点和结束点。在发送数据前,在每个数据包的开头和结尾添加一个特定的标志位或者定界符,用于表示数据包的起始和结束。接收方可以根据这些标志位或定界符来确定数据包的边界。这样可以保证接收到的数据是完整的。
  • 由于下位机回发的数据速度过快,导致串口出现readyread信号就立即将数据发送回来。

解决方案:

设置接收时延50ms
头文件导入包和设置成员

#include <QTimer>

private:
    QTimer *timer;

修改槽函数

connect(&serial_1, &QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);
connect(timer,&QTimer::timeout,this,&MainWindow::ReadData);

定义ready函数,执行延时50ms

void MainWindow::serialPort_readyRead()
{
    timer->start(50);
}

定义ReadData函数,结束延时并将数据读取出来

void MainWindow::ReadData()
{
    timer->stop();
    QByteArray data = buffer.append(serial_1.readAll());
    qDebug() << "receive data: " << data;
    serialPort_readyDisplay(data,"RX");
    buffer.clear();
}

总结:

设置接收延时,解决接收端数据问题,希望帮助到大家。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值