QTSERIALPORT:READALLはすべてのデータと新しいReadyReadシグナルなしではありません

StackOverflow https://stackoverflow.com//questions/23014154

質問

USBシリアルポートから読んでいますが、データが「盗まれた」と問題がある場合があります。 受信したメッセージで、新しいメッセージを送信して、答えのために再び待機してください。

ASYNCモードでは、Windows 7でQT 5.2.1を使用しています。しばらくした後、私のプログラムは無期限に答えを待っているので立ち往生します。 (一種のバグですが、十分に待っていれば発生します。 デバッガを使って、私はメッセージの断片を受け取っただけだと思った。さらなる調査では、QSerialPortがその「ReadCunkBuffer」にメッセージ全体を持っていることがわかります。

これは私の「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();
}
}
.

私も試している間(port-> bytesavailaliable() "。しかし、MSGBufferのメッセージの一部のみが表示されますが、QSerialPortsバッファの1つ全体が表示されます。QSerialPortが信号を発行したとき、実際に全体を見たときにわからないメッセージ

多分これはいくつかのWindowsドライババッファの問題もありますか?私が私のアプリケーションを殺してパテを撃って改行を送ったら、私はその残りのメッセージを取得します。 これは私のシリアル通信「パートナー」、BCの問題ではないことに注意してください。それはPATTYなどで動作します、そして私は "ReadCunkbuffer"でMSGを見ることができます。

役に立ちましたか?

解決 2

組み込みデバイスのソフトウェアのバグであり、ソフトウェアがシリアルポートを介して通信することがわかりました。:/

他のヒント

問題はあなたのコードのどこかにあることができます。ReadyRead()はあなたが一度にメッセージ全体を受け取ることを保証しないからです。メッセージは、次のreadyRead()呼び出しの上に部分的になることがあります。

私も歪んだ:

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

QbytearrayからQSTRINGへの変換、そしてQSTRINGを2回QSTRINGに変換するのはなぜですか?

qdebug()からのデバッグ出力を:

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

あなたが「立ち往生」のとき?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top