В настоящее время я работаю над проектом, который предусматривает последовательную связь между 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.
Выглядит как последовательный порт 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;
}
Это может не решить вашу проблему, но, если повезет, это даст вам сообщение об ошибке.
Других решений пока нет …