串口数据接收不完整解决

👁️ 6749 ❤️ 856
串口数据接收不完整解决

项目场景:

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

问题描述

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

理想的接收情况:

原因分析:

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

解决方案:

设置接收时延50ms

头文件导入包和设置成员

#include

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();

}

总结:

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

← PRJ格式是一种常见的文件格式,用于存储项目文件或工程文件的相关信息 如何去除衣服上的墨漬? →