Raspberry Pi で qextserialport を使用して、PanStamp (Arduino 互換デバイス) と通信しています。
Pi に接続されたこの PanStamp は、次の 2 つの機能を実行します。
- センサーの読み取り値を毎秒 (約 12 バイト) 送信します。
- ワイヤレス リンクを介して受信したすべてのデータを送信します (約 60 バイトを 1 秒あたり約 6 回)。
私のアーキテクチャは次のとおりです。
- ハブ: PanStamp + ラズベリーパイ;
- サテライト: PanStamp + いくつかのセンサー。
次の 2 つの状況があります。
- データをハブにワイヤレスで送信する衛星。この状況では、Pi はシリアル ポートを介して毎秒大量のデータを受信します。
- サテライトをオフにすると、Pi はシリアル ポート経由で毎秒約 12 バイトを受信します。
サテライトがオフの場合、readyRead()
バイトが到着するたびに信号が生成されるわけではなく、プログラムを「非同期」状態に追い込み、データパケットを読み取るたびに1つ以上がバッファにとどまります(成長し続けます)。
しかし、サテライトの電源を入れて Pi が大量のデータを受信し始めると、この「非同期」状態が消え、データのバーストが発生し (バッファが高速になり、空になった後)、プログラムが動作し始めます。リアルタイム"。
これが私のプログラムの出力の例です: www.tiago.eti.br/storage/iSEDE.log
ログでわかるように、使用可能なバイト数は増加し続け、データは毎秒送信されます ( で始まる行HUB:
は毎秒処理されていません。先頭にタイムスタンプがあります)。しばらくすると、バーストが発生し (衛星がオンになりました)、1 秒ごとに大量のデータが処理されます。衛星のデータの処理が開始され (で始まる行8
)、バッファが空になり、プログラムがデータの処理を開始します。 "リアルタイム"。
では、バッファが大きくなりすぎないようにし、データを失わないようにするにはどうすればよいでしょうか? readyRead()
バッファが 100 バイトを超えたときに接続されている関数を呼び出そうとしましたが、混乱が生じ、いくつかのパケットが失われ始めました。