UART не получает все отправленные значения в Qt - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь отправить данные из PSoc через UART на мой ПК, где требуется хранить данные с помощью Qt. PSoc отправляет 3 байта данных. Тезисы 3 байта повторяются с частотой 2,5 Гц. Когда я проверяю сигналы с помощью моего осциллографа, все в порядке. Когда я получаю данные с программным обеспечением 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 ]

2 голосов
/ 03 ноября 2019

Вы читаете только фиксированный размер с чтением.

Возможно, вы получаете сигналы readyRead с различными доступными байтами, но вы читаете только фиксированный размер их

В своем слоте readyRead попробуйтедля чтения всех доступных байтов.

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

Вы также можете использовать функцию readAll ().

0 голосов
/ 04 ноября 2019

Я только что нашел решение! Вы должны установить правильный размер буфера чтения. Поэтому для чтения пакета из трех байтов я должен установить:

serial->setReadBufferSize(3);
...