繁体   English   中英

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

[英]QtSerialPort: readAll doesn't yield all data and no new readyRead signal

我正在从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();
}
}

我也尝试了“ while(port-> bytesAvailiable()”。但是我只在msgBuffer中看到消息的一部分,而在QSerialPorts缓冲区中看到整个消息。不确定QSerialPort何时发出信号以及何时实际看到整个消息。

也许这也是一些Windows驱动程序缓冲区问题? 让我感到困惑的是,如果我终止了我的应用程序并启动了腻子并发送了换行符,那么我将得到其余的消息。 请注意,这可能不是我的串行通讯“合作伙伴” bc的问题。 它通过puTTY等工作,我可以在“ readChunkBuffer”中看到味精。

问题可能出在您的代码中。 因为readyRead()不能保证您会一次收到整个消息; 该消息可以通过以下readyRead()调用来部分传递。

我也受以下困扰:

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

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

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

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

当你“卡住”?

事实证明,这是嵌入式设备软件中的一个错误,该软件通过串行端口进行通信。 :/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM