【问题标题】:QIODevice::readAll() not working properly?QIODevice::readAll() 无法正常工作?
【发布时间】:2014-03-24 16:20:38
【问题描述】:

我目前正在从事一个涉及 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() 不显示我需要的数据。

新数据():

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。

【问题讨论】:

标签: c++ qt serial-port arduino qiodevice


【解决方案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;
}

它可能无法解决您的问题,但如果运气好,它会给您错误消息。

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 2018-03-29
    • 1970-01-01
    • 2016-09-01
    • 2012-07-11
    • 2018-04-08
    • 2017-04-20
    • 2018-10-02
    • 2016-09-04
    相关资源
    最近更新 更多