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.

0

Решение

Выглядит как последовательный порт 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;
}

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]