1

我正在从 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 驱动程序缓冲区问题?令我困惑的是,如果我杀死我的应用程序并启动 puTTY 并发送一个换行符,我会得到其余的消息。请注意,这可能不是我的串行通信“伙伴”的问题,bc。它通过 puTTY 等工作,我可以在“readChunkBuffer”中看到消息。

4

2 回答 2

0

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

于 2014-05-02T11:07:32.230 回答
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;
    ...
}

当你“卡住”?

于 2014-04-18T13:45:39.943 回答