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;
}
Это может не решить вашу проблему, но, если повезет, это даст вам сообщение об ошибке.