PAGE

CV7のMIP通信|ACK・測定データ・チェックサムの読み方

INERTIAL GUIDE

CV7のMIP通信|ACK・測定データ・チェックサムの読み方

3DM-CV7のMIPパケット構造、ACK/NACK、測定データ、Field Length、Big-endian、Fletcherチェックサムの読み方を解説します。

MIPを自社ソフトウェアへ実装するときは、シリアルポートから受け取ったバイト列を「1回のread=1パケット」と考えないことが重要です。

コマンドへのACK/NACKと、連続して送信される測定データは同じ通信路を流れます。受信バッファへ蓄積し、MIPパケット単位へ切り出してから、Descriptor SetとField Descriptorに従って処理します。

このページでできること

  • MIPパケットの基本構造を理解する
  • ACK/NACKと測定データを区別する
  • Field LengthとDescriptorから可変フィールドを読む
  • Big-endianの数値を正しくデコードする
  • Fletcherチェックサムで破損パケットを検出する
  • 分割受信・複数パケット同時受信へ対応する

1. MIPパケットの構造

MIPパケットは概ね次の構造です。

部分 内容
Sync パケット開始を示す2 byte
Descriptor Set パケットの種類
Payload Length Payload長
Payload 1個以上のField
Checksum 2 byte Fletcher checksum

各Fieldは、

Field Length → Field Descriptor → Field Data

で構成されます。

Field Lengthを使って次のField位置を決めるため、固定長の構造体だけで処理しない方が安全です。


2. ACK/NACKと測定データを区別する

コマンドを送信すると、デバイスはACK/NACKを返します。

ACK/NACK FieldのDescriptorは0xF1です。

一方、サンプリング中はIMU DataやFilter Dataなどの測定パケットが継続的に送られます。

したがって、

コマンドを送った直後に受信した最初のパケットが、そのコマンドのACKである

とは限りません。

実装では、受信したパケットごとにDescriptor SetとField Descriptorを確認し、目的のコマンドに対応するACK/NACKを探します。

コマンドによっては、ACK/NACK以外のResponse Data Fieldも同じ応答パケットに含まれます。


3. Syncから完全な1パケットを切り出す

シリアル通信やUSB通信では、1回のreadで受け取る単位とMIPパケットの境界が一致するとは限りません。

例えば、

  • パケットの前半だけ届く
  • 1回のreadに2パケット入る
  • 不要なbyteの後に次のSyncが現れる

といった状況があります。

基本的な受信処理は、

  1. 受信byteをバッファへ追加する
  2. Sync列を探す
  3. ヘッダーからPayload Lengthを読む
  4. パケット全体が揃うまで待つ
  5. Checksumを検証する
  6. Descriptor Setと各Fieldを解析する
  7. 処理済みbyteをバッファから除く

という流れにします。

Checksum不一致や不正なLengthを検出した場合は、次の有効なSyncを探して再同期します。


4. 数値のbyte orderを確認する

MIPのData Communications Protocolでは、フィールド定義に従って数値を読みます。

複数byteの整数やIEEE-754浮動小数点値を扱うときは、仕様に記載されたbyte orderを使用します。

例えば3軸加速度がfloat×3なら、

  • X:4 byte
  • Y:4 byte
  • Z:4 byte

として順番に読みます。

ホストCPUがlittle-endianでも、受信したbyte列をそのまま構造体へコピーして正しい値になるとは限りません。

MIP SDKを利用すると、このbyte変換やField解析を独自実装する量を減らせます。


5. Checksumを確認する

MIPパケット末尾には2 byteのFletcher checksumがあります。

受信側では、パケットの対象範囲からチェックサムを計算し、受信したChecksumと比較します。

一致しないパケットはそのまま測定値として採用せず、通信ログや破損数として記録します。

通信が不安定な場合に、

  • Checksum error
  • Length error
  • 不明Descriptor
  • 受信タイムアウト

を別々に数えておくと原因を切り分けやすくなります。


6. Command Resultと通信タイムアウトを分ける

プログラムでは、少なくとも次を分けて扱います。

  • ACK:デバイスがコマンドを受理
  • NACK:デバイスがコマンドを拒否
  • ホスト側タイムアウト:期待した応答を期限内に受信できない
  • 通信エラー:送受信処理自体が成立しない

NACKとタイムアウトは原因が異なります。

不正なパラメータでNACKになったのか、正しい応答をホストが受信できなかったのかを区別してください。


7. パーサを試験するときの項目

MIPパーサを実装したら、正常パケットだけでなく次の条件も試します。

  • 1 byteずつ分割して入力
  • 1回で複数パケットを入力
  • パケット途中まで入力して続きは次回にする
  • Checksumを故意に壊す
  • 未知のField Descriptorを含める
  • ACKと測定パケットを交互に入力
  • 可変数のFieldを含める

通信ログには、元byte列と解析結果を対応付けて残すとデバッグしやすくなります。


8. MIP SDKを使う場合

最新のMicroStrain慣性製品向けにはMIP SDKが提供されています。

低レベルのパケット生成・解析をすべて独自実装する必要がない場合は、SDKを利用する方が保守しやすくなります。

ただし、アプリケーション側では依然として、

  • どのデータを購読するか
  • コマンドの成功・失敗をどう扱うか
  • Timestampをどう使うか
  • 再接続時に設定をどう復元するか

を設計する必要があります。


参考資料

原典リンク

既存の関連ページもあわせて確認

既存の技術解説・ソフトウェア説明と相互に参照できるよう、本番反映時に現在のURLへ接続します。

技術相談
当サイトでは、サイトの利便性向上のため、クッキー(Cookie)を使用しています