项目场景:
基于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();
}
总结:
设置接收延时,解决接收端数据问题,希望帮助到大家。