首页 > 解决方案 > UART 没有接收到 Qt 中所有发送的值

问题描述

我正在尝试通过UART将数据从PSoc发送到我想用Qt存储数据的PC。PSoc 发送 3 个字节的数据。这 3 个字节以 2.5Hz 的频率重复。当我用示波器检查信号时,一切都很好。当我使用 HTerm 软件收到数据时,一切都按预期进行。当我将用 c++ 编写的代码与 Qt 一起使用时,我遇到的问题是,并非所有数据都在 Qt 中接收,只有三分之一在内存中。我希望每个新字节都会发出信号 readyRead?但似乎该信号仅在 3 个字节的包的开头发出。此外,我的 qDebug 输出不会对 PSoc 的更改做出反应。因此,当我更改 PSoc 的值时,qDebug 中的输出不会改变。

我已经尝试读取 3 个字节 (serial->read(3)),然后我首先收到了一些单个字节,经过几次读取后,我得到了我发送的 3 个字节,但这不是那么可重现。

    connect(serial, SIGNAL(readyRead()), this, SLOT(readData()));

    serial->setPortName(gui->ui->comboBox->currentData().toString());
    serial->setBaudRate(QSerialPort::Baud115200);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);
    serial->setFlowControl(QSerialPort::NoFlowControl);

    void uart::readData()
    {
        QByteArray data = serial->read(1); 
        qDebug() << data;
    }

我希望每秒 2.5 次像“0x01”“0x02”“0x03”这样的输出,但我只得到“0x01”

标签: c++qtuart

解决方案


您只能通过 read 读取固定大小。

可能是您获得了具有不同可用字节的 readyRead 信号,但您只读取了它们的固定大小

在您的 readyRead 插槽中尝试读取所有可用字节。

qint64 available = serial->bytesAvailable();
if (available > 0)
{
    QByteArray data = serial->read(available);
    qDebug() << data;
}

您还可以使用 readAll() 函数。


推荐阅读