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」でメッセージを見ることができます。