UART 不接收 Qt 中的所有发送值

UART doesn't receive all sent values in Qt

我正在尝试通过 UART 从 PSoc 向我的 PC 发送数据,我想用 Qt 存储数据。 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”

您只使用 read 阅读固定大小的内容。

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

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

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

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

我刚刚找到了解决方案! 您必须将读取缓冲区大小设置为正确的值。 所以要读取三个字节的包,我必须设置:

serial->setReadBufferSize(3);