センサー監視プログラムのデータが正しくありません。

センサー監視プログラムのデータが正しくありません。

私はRaspberry Piの4つのUSBシリアルポートからデータを慢性的に記録しています。ビューよりも状況をより複雑にするいくつかの制限があります。これまでに試みたすべての結果は、データがランダムに欠落しているか、誤った順序で表示される結果をもたらしました。私はPythonでプログラミングしています。申し訳ありません。次の内容はかなり長いが、状況を完全に説明したかった。

データの要約は次のとおりです。

ㅏ。各シリアルポートは、2つの115.2kbデータ測定チャンネル(つまり8つのデータチャンネル)を出力するセンサーに接続されています。各測定のデータは1行で構成されています。これらの2行は、1つのメッセージではなくシリアルデバイスから個別に送信されます。

b。各測定は、「XXXX.xxxxxxxxxx chX」形式のタイムスタンプで始まります。整数部分は1から始まり無限に増加する秒で、小数部分は小数点以下11桁(10ピコ秒分解能)です。タイムスタンプの後には、一意の識別子「chA」、「chB」などが最大「chH」まで続き、行は改行文字で終わります。タイムスタンプはいデータ - 外部機器からパルスを受信すると表示されます。例は次のとおりです。 「123.12345678901 chD\n」

b。公称データレートは、チャンネルあたり毎秒1回の測定です。

氏。 8つの読み取り値の各「セクション」について、すべての有効なタイムスタンプが中央値の+/- 0.5秒以内になければならないことを指定できます。電波は通常数マイクロ秒に近いため、1秒の範囲は有効なデータに多くの余裕を与えます。

セクションdのタイムスタンプは、2番目の境界にまたがるか、すべて1秒以内に発生する可能性があります(ステップ関係は開始時に任意に設定されます)。

e.各セクションのデータ行が受信される順序は保証されません。以下は、例のセクションです。

1234.01231231231 確認
1234.02342342342chB
1233.99999912345ch
1234.03453453453chC
1234.03213213213 chD
1234.04324324324フラン
1234.01234567890 chG
1233.99999954321chH

これは次のことを示します。 (1)セクションのデータは整数秒にわたっている可能性があります。 (2) データはチャンネル順に受信できない場合があります。 (3) データは常に昇順に受信されません。

厳密なチャネルIDシーケンス(chA、chB、chC、chD、chE、chF、chG、chH)に従って各セクションのデータを配置する必要があります。上記の例は、次のように記録する必要があります。

1234.01231231231 確認
1234.02342342342chB
1234.03453453453chC
1234.03213213213 chD
1233.99999912345ch
1234.04324324324フラン
1234.01234567890 chG
1233.99999954321chH

私の現在のアプローチは次のとおりです。

各シリアルポートに対して別々のスレッドで実行されるSerial.read()呼び出しがあり、共通キューを提供します。このキューは、すべてゼロで初期化された8項目のリストを使用して処理されます。ここで、各リスト項目はチャネルに関連付けられています(たとえば、list[0]はchA、list[1]はchBです。など)。各データ行が入ると、タイムスタンプはそのチャネルの適切なスロットに配置されます。リストに0の値がなくなった場合は、セクションが完了し、chAからchHまでのリストを繰り返して各値を出力し、次のセクションで0にします。

質問:

これは通常動作しますが、ランダムにデータの順序が間違っています。たとえば、1チャンネルのシリアルデータが1秒間欠落しているため、リスト内のスロットが1秒後に次のタイムスタンプで埋められます。セクション全体が消えることがあります(まれですが)。私の考えでは、シリアルデータの問題が非同期的に入ってくることが判明し、ランダムな処理遅延によって値が失われることがわかりました(テストの結果、シリアルデータが実際にRPiに送信されることが確認されました。損失はそれから発生します)。処理)。

最初は、同じネットワーク上のリモートシステムが有線でデータを取得できるように、ソケットサーバーにデータを供給しました。ネットワークスタックが問題の原因である可能性があると考えて、RPiにローカルにデータを書き込んでみました。うまくいきますが、まだ欠落しており、順序が正しくないサンプルが表示されます。

そのため、メッセージの損失を引き起こすボトルネックを回避したり、データを適切なセクションに並べ替えることができる一種の再構成プログラムを提供する方法を探しています。また、シングルスレッドで4つの通信ポートを読み取ることが最善のアプローチであるかどうかはわかりません。どんなアイデアでも大いに感謝します。もう一度申し訳ありません。質問が長すぎました。

ありがとうございます!男

ベストアンサー1

おすすめ記事