我目前正在开展一个涉及Arduino和笔记本电脑之间串行通信的项目。我知道Arduino确实发送了我需要的数据,请看这张图片:http://s1.postimg.org/w5wisaetr/Help.png
现在另一端我的笔记本电脑连接到Arduino并运行我使用QT Creator制作的程序。但是,当从串行端口读取数据时,我无法让程序显示此信息。
我连接了我的readData()函数,以便在收到数据时执行:
connect(m_serialPort, SIGNAL(readyRead()), m_dataGathering, SLOT(newData()));
这很有效,只要从Arduino传输了某些内容,就会调用newData()函数。但是函数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不仅发送了我需要的数据,还发送了一些不需要的字符(请参见第一个链接中的图片),但我不认为这是一个问题,因为我稍后会对此进行过滤。 / p>
非常感谢所有帮助。
更新:我发现readAll()函数返回的QByteArrays的size()等于0。
答案 0 :(得分:0)
如果序列端口QIODevice
返回0,则看起来不会实现bytesAvailable
。这也可能是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;
}
它可能无法解决您的问题,但幸运的是它会给您错误信息。