我正在从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”中看到MSG。

有帮助吗?

解决方案 2

结果是软件通过串行端口通信的嵌入式设备软件中的错误。:/

其他提示

问题可以在代码中的某个地方。因为readyRead()不能保证您会立即收到整个信息;消息可以通过以下readyRead()呼叫零件来源。

我也紧张:

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

为什么要从qbytearray转换为qstring,然后qtring到qbytearray两次?

您可以为qdebug()提供调试输出:

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

当你“卡住”?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top