QIODevice::readAll() не работает должным образом?

В настоящее время я работаю над проектом, который предусматривает последовательную связь между Arduino и ноутбуком. Я знаю, что Arduino действительно отправляет данные, которые мне нужны, смотрите эту картинку: http://s1.postimg.org/w5wisaetr/Help.png

Теперь на другом конце мой ноутбук подключен к Arduino и работает с программой, которую я сделал с использованием QT Creator. Однако при чтении данных из последовательного порта я не могу заставить программу отображать эту информацию.

Я подключил свою функцию readData() для выполнения при получении данных следующим образом:

connect(m_serialPort, SIGNAL(readyRead()), m_dataGathering, SLOT(newData()));

Это работает, и функция newData() вызывается всякий раз, когда что-то передается из Arduino. Однако функция newData() не отображает данные, которые мне нужны.

NewData():

void DataGathering::newData()
{
    QByteArray rMsg = m_serial->readAll();
    qDebug() << rMsg.constData();
}

Это только отправляет пустое сообщение на дисплей. Вот так: http://s2.postimg.org/dkcyip2u1/empty.png

Однако работает следующий код:

void DataGathering::newData()
{
    QByteArray rMsg("\nTest...");// = m_serial->readAll();
    qDebug() << rMsg.constData();
}

Этот код отображает сообщение так, как должно. Однако, другое отличие в отображении вывода состоит в том, что когда рабочий код выполняется, моя консоль также отображает много ошибок кадрирования, я предположил, что это связано с тем, что скорость передачи нежелательных символов отличается от данных, которые мне нужны.

Вот почему я начал расспрашивать функцию readAll(). Также очевидно, что Arduino отправляет не только данные, которые мне нужны, но также некоторые нежелательные символы (см. Изображение в первой ссылке), но я не вижу в этом проблемы, так как я отфильтрую это позже.

Вся помощь очень ценится.

Обновление: я обнаружил, что функция readAll() возвращает QByteArrays с size(), равным 0.

1 ответ

Выглядит как последовательный порт QIODevice не реализует bytesAvailable, если он возвращает 0. Это также может быть, почему readAll() не удается, в зависимости от того, как это реализовано. Но хотя бы readAll() имеет проблему невозможности сообщить об ошибке.

Попробуйте использовать read вместо этого метод для лучшей диагностики, как этот (не проверено):

void DataGathering::newData()
{
    QByteArray rMsg;
    for(;;) {
        char buf[256]; // read data in this size chunks
        qint64 len = m_serial->read(buf, sizeof buf);
        if (len <= 0) {
            if (len < 0) {
                qDebug() << "newData() read error" << m_serial->errorString();
            }
            break; // for(;;)
        }
        rMsg.append(buf, len);
    }
    qDebug() << "newData() got byte array" << rMsg.size() << ":" << rMsg;
}

Это может не решить вашу проблему, но, если повезет, это даст вам сообщение об ошибке.

Другие вопросы по тегам