我正在使用QT从串口读取数据,在主窗口中我编写了以下代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QTextStream>
#include<QSerialPort>
#include<QSerialPortInfo>
#include<QtDebug>
#include<QThread>
QSerialPort *serial;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent),
ui(new Ui::MainWindow),
m_standardOutput(stdout)
{
ui->setupUi(this);
serial= new QSerialPort(this);
serial->setPortName("COM3");
serial->setBaudRate(QSerialPort::Baud115200);
serial->setDataBits(QSerialPort::Data8);
serial->setParity(QSerialPort::NoParity);
serial->setStopBits(QSerialPort::OneStop);
serial->setFlowControl(QSerialPort::NoFlowControl);
serial->open(QIODevice::ReadOnly);
connect(serial, &QSerialPort::readyRead, this, &MainWindow::ReaderH);
float HUM;
HUM=H;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::ReaderH()
{
quint64 X=20;
serial->waitForReadyRead();
m_readData=serial->QSerialPort::read(X);
//if (!m_timer.isActive())
// m_timer.start(5000);
inter2=QString(m_readData);
QStringList firstlist2= inter2.split(";");
m_readData3=firstlist2.takeFirst();
H=m_readData3.toFloat();
qDebug() <<"Data:"<<m_readData<< " \r\n";
//QThread::sleep(11);
}

程序在几秒钟内正确读取数据,一段时间后读取开始不同步,如下所示:
数据:"60.904655;25.779804$“
数据:"60.970406;25.816269$“
数据:"60.988335;25.798037$“
数据:“60。”
数据:"883736;25.7“
数据:"61570$“
数据:“60。”
数据:"91063“
数据:"7;25.779804$“
数据:“60。”
数据:“934544;25。”
数据:"798037$“
数据:"60“
数据:".871784;25.798037$“
我不明白如何解决这个问题。谢谢您抽时间见我。
发布于 2020-08-06 17:48:57
当从串口读取数据时,你需要自己把“流”切成“消息”。为了保持健壮性,您不应该对数据的时间做出任何假设。
当接收到数据时,您应该将它们输入到“解码器”,即通常是一个一个字节一个字节地读取并找到数据包的“分隔符”的类。
解码器类通常有一个内部缓冲区,可能如下所示:
class Decoder : public QObject
{
Q_OBJECT
signals:
void messsageReceived(QByteArray message);
public:
void decode(const QByteArray& bytes)
{
for (char c : bytes)
{
if (c == '$')
{
emit messsageReceived(m_buffer);
m_buffer.clear();
}
else
{
m_buffer.append(c);
}
}
}
private:
QByteArray m_buffer;
};此外,通常不能保证您将从数据包的开头开始读取。第一次读取可能发生在数据包的中间,这就是为什么大多数协议使用"Start“和"Stop”序列,或者如果您不能验证第一个数据包的一致性,您应该丢弃它。在上面的代码片段中,第一个包没有被处理。
此外,串行端口不保证在线路上传输无差错的字节,因此如果数据是敏感的,则必须具有验证机制,例如校验和(即CRC)。如果某些数据损坏,则应该丢弃该数据包,并且可能必须在更高级别上设置一种机制,以便重新传输该数据包(如果需要)。
https://stackoverflow.com/questions/63279729
复制相似问题