2

バックグラウンド

現在、TelosB モートを使用してセンサー データを収集し、それを USB シリアル ポート経由で 115200 ボーで送信しています。

以前は、Python を使用してモートとインターフェイスするプログラムを開発していましたが、Python の GIL には、Python を使用しないことによってのみ解決できるスレッド化の問題があります (最初のテスト フェーズの後で、その同時実行性が必要でした)。 C++/Qt に移行しました。予備知識がなく、Qt のベスト プラクティスのほとんどを学び、すべてが完全に機能するようになったため、Qt に多くの時間を費やしました。この問題以外のすべて。

問題

ポートを読み取ろうとすると、大量のデータが送信されると、一部のデータ セットが不思議なことにエラーになり、プロジェクトで望ましい損失率よりも高くなります。

これは qextserialport を使用すると発生しますが、 pySerialでは発生しません。

これは、qextserialportでポートを初期化する方法です。

port.setName("COM3");
port.setQueryMode(QextSerialPort::EventDriven);
port.setBaudRate(BAUD115200);
port.setParity(PAR_NONE);
port.setDataBits(DATA_8);
port.setStopBits(STOP_1);
port.setFlowControl(FLOW_OFF);

およびpySerial :

port = Serial('COM3', 115200)

質問

したがって、2 つのライブラリがポートを初期化する方法に何か違いがあるのではないかと思いますが、シリアル プログラミングの経験がなく、間違っている可能性があります。

このエラーの原因は何か分かりますか?

4

1 に答える 1

2

QextSerialPort::bytesAvailable()の代わりに誤って使用していたことがわかりましたQextSerialPort::atEnd()。私は別の質問でこれを見ました、そしてそれは私がタイムアウトを待っている間に私のアプリケーションを基本的にブロックしたエラーメッセージを取り除くのを助けました、そして

Wesのコメントは、モートにすべてのデータを格納するための十分なメモリが割り当てられておらず、データが失われるという、他の問題の解決につながりました。

于 2012-03-15T11:51:38.107 に答える