串口数据接收不完整解决

项目场景:

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


问题描述

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

理想的接收情况:

在这里插入图片描述


原因分析:

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

总结:

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

你可能感兴趣的:(嵌入式,qt,开发语言,嵌入式硬件)