UART未在Qt

时间:2019-11-03 08:45:56

标签: c++ qt uart

我试图通过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;
    }

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

2 个答案:

答案 0 :(得分:2)

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

是否可能准备好ReadReadRead信号并使用不同的字节,但只能读取固定大小的信号

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

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

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

答案 1 :(得分:0)

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

serial->setReadBufferSize(3);