コマンドを送信出来たが、受信データがおかしい。壊れたデータをたくさん受信します。

サポート

コマンドに対する応答は、センサからイベントまたはレスポンスという一連のデータ列として送信されます。各データ列は、ヘッダからBCCまでを含む一つのデータ単位となります。


しかし、受信のタイミングによっては、このデータ単位が一括で受信されるとは限りません。


例えば、.NETの場合、シリアルデータを受信すると"SerialPort.DataReceived"イベントが発生します。しかし、センサから1つのレスポンスが送信された場合でも、PC側では1回の受信で1つのレスポンス全体を受け取れるとは限らず、データが複数に分割されて受信されることがあります。


このため、バッファに格納されたデータをそのまま取り出しても、必ずしも正しいレスポンスデータにはなりません。複数回発生する"SerialPort.DataReceived"イベントごとに受信したデータを連結することで、初めて1つのレスポンスデータとして成立します。


また、逆に複数のレスポンスが一度に受信され、連結された状態で届く場合もあります。


このような状況を考慮し、データ受信用のFIFOキューを作成し、受信したデータを一旦キューに格納する設計としてください。そして、キューのデータを適切に解析し、有効なデータ列を取り出して処理(*)を行うようにしてください。


(*) 具体的には、キューの先頭からヘッダを検索し、後続のCommand Codeからパラメータ長を算出、そのバイト長のBCCを計算し、一致すれば有効なデータ列として処理し、キューから削除する。


いいねランキング

このサイトの内容について質問してください。
単語だけではなく「〇〇について教えて」といった聞き方をしてもらえると答えやすいです!