首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QT:从串口连续读取数据的问题

QT:从串口连续读取数据的问题
EN

Stack Overflow用户
提问于 2020-08-06 16:31:46
回答 1查看 326关注 0票数 1

我正在使用QT从串口读取数据,在主窗口中我编写了以下代码:

代码语言:javascript
运行
复制
#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$“

我不明白如何解决这个问题。谢谢您抽时间见我。

EN

Stack Overflow用户

发布于 2020-08-06 17:48:57

当从串口读取数据时,你需要自己把“流”切成“消息”。为了保持健壮性,您不应该对数据的时间做出任何假设。

当接收到数据时,您应该将它们输入到“解码器”,即通常是一个一个字节一个字节地读取并找到数据包的“分隔符”的类。

解码器类通常有一个内部缓冲区,可能如下所示:

代码语言:javascript
运行
复制
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)。如果某些数据损坏,则应该丢弃该数据包,并且可能必须在更高级别上设置一种机制,以便重新传输该数据包(如果需要)。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63279729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档