1

USB シリアル ポートから読み込んでいますが、データが「スタック」するという問題が発生することがあります。受信したメッセージに対して、新しいメッセージを送信し、再度応答を待ちます。

Windows 7でQtSerialPortを非同期モードで使用してQt 5.2.1を使用しています。しばらくすると、答えを無期限に待っているため、プログラムが動かなくなります。(これは一種の一時的なバグですが、十分に長く待つと発生します)。デバッガーを使用すると、メッセージの断片しか受信していないことがわかりました。さらに調査すると、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 を起動して改行を送信すると、メッセージの残りの部分が表示されることです。これはおそらく私のシリアル通信「パートナー」の問題ではないことに注意してください。それはpuTTYなどを介して動作し、「readChunkBuffer」でメッセージを見ることができます。

4

2 に答える 2

0

ソフトウェアがシリアルポート経由で通信する組み込みデバイスのソフトウェアのバグであることが判明しました。:/

于 2014-05-02T11:07:32.230 に答える