QTSERIALPORT:READALLはすべてのデータと新しいReadyReadシグナルなしではありません
-
21-12-2019 - |
質問
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;
...
}
.
あなたが「立ち往生」のとき?