QtSerialPort:readAll不会产生所有数据,也不会产生新的readyRead信号

时间:2014-04-11 13:34:32

标签: c++ qt serial-port qtserialport

我正在从USB串口读取数据,但有时我会遇到问题,数据会被卡住"。 收到消息后,我发送新消息并再次等待答案。

我在Windows 7上使用Qt 5.2.1,在异步模式下使用QtSerialPort。过了一会儿,我的程序卡住了,因为我无限期地等待答案。 (这是一种短暂的错误,但如果等待的时间确实会发生这种情况)。 通过调试器,我能够看到我只收到了消息的片段。在进一步调查中,我可以看到QSerialPort在其" readChunkBuffer"中有完整的消息。

这是我的" readyRead"处理程序:

void ModuleCommunicator::onReadyRead()
{
if (port->bytesAvailable() > 0) {
    QString msg = QString(port->readAll());
    msgBuffer->append(msg);
    //qDebug() << "onReadyRead: msg: " << msg;

    if (msg.endsWith("\n")) {
        msg = msgBuffer->join("").trimmed();
        msgBuffer->clear();
        msgBuffer->append(msg.split("\r\n"));
    } else {
        return;
    }

    for (int i = 0; i < msgBuffer->size(); i++) {
        msg = msgBuffer->at(i);

        qDebug() << "MSG: " << msg << endl;

        if (isResponse(msg)) {
            handleMsg(msg);
        }
    }

    msgBuffer->clear();
}
}

我也试过&#34; while(port-&gt; bytesAvailiable()&#34;。但我只看到msgBuffer中的部分消息,但是QSerialPorts缓冲区中的整个消息。不确定QSerialPort何时发出信号当它真正看到整个信息时。

也许这也是一些Windows驱动程序缓冲区问题?让我感到困惑的是,如果我杀死我的应用程序并启动puTTY并发送换行符,我会得到剩下的信息。 请注意,这可能不是我的串行通信问题&#34; partner&#34;,bc。它可以通过puTTY等工作。我可以在&#34; readChunkBuffer&#34;中看到msg。

2 个答案:

答案 0 :(得分:0)

问题可能出现在您的代码中。因为readyRead()不保证您将立即收到整个消息;消息可以通过以下readyRead()调用来实现。

我也很紧张:

QString msg = QString(port->readAll());
msgBuffer->append(msg);

为什么要从QByteArray转换为QString,然后将QString转换为QByteArray两次?

您可以从qDebug()提供调试输出:

void ModuleCommunicator::onReadyRead()
{
    ...
    QByteArray ba = port.readAll();
    qDebug() << ba;
    ...
}

当你&#34;卡住&#34;?

答案 1 :(得分:0)

原来,这是软件通过串口通信的嵌入式设备软件中的一个错误。 :/