2

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 バイトを超えたときに接続されている関数を呼び出そうとしましたが、混乱が生じ、いくつかのパケットが失われ始めました。

4

1 に答える 1

4

あなたの問題は、人々がQIODeviceで行う最も一般的な間違いにあります..readyReadがすべてのバイトで呼び出されると誤って想定し、そのように機能する場合は完全に間違っていると言っています。アイデアは、 readyReadを受け取るたびに、デバイスから読み取る何かがあるということです。1 バイト、10 バイト、1k などです。簡単に言えば、ブロック転送の場合の CPU 負荷を最小限に抑えるために、そのように行われます。また、ハードウェアでデータをバイト単位ではなくブロック単位で読み取ることもできます。

したがって、readAll() を呼び出して、到着した利用可能なすべてのデータを取得し、好きな方法で処理する必要があります。

あなたはここを見てみたいかもしれません..

于 2013-08-06T19:44:18.393 に答える