非同期シリアル通信は今日でも電子機器に広く普及しているため、私たちの多くはそのような質問に時々出くわしたと思います。電子デバイスD
と、PC
シリアル回線(RS-232または同様のもの)で接続され、継続的に情報を交換する必要があるコンピューターを検討してください。すなわち、PC
それぞれコマンドフレームを送信しており、それぞれステータスレポート/テレメトリーフレームで応答しています(レポートはリクエストへの応答として、または独立して送信できます-ここでは実際には関係ありません)。通信フレームには、任意のバイナリデータを含めることができます。通信フレームが固定長パケットであると仮定します。X ms
D
Y ms
問題:
プロトコルは継続的であるため、受信側は同期を失ったり、進行中の送信フレームの途中で「結合」したりする可能性があるため、フレームの開始(SOF)がどこにあるかはわかりません。Aデータは、SOFに対する相対的な位置に基づいて異なる意味を持ち、受信したデータは破損する可能性があり、永久に破損する可能性があります。
必要なソリューション
短い回復時間でSOFを検出するための信頼性の高い区切り/同期スキーム(つまり、再同期に1フレーム以上かかることはありません)。
私が知っている(そして使用している)既存のテクニック:
1)ヘッダー/チェックサム -事前定義されたバイト値としてのSOF。フレームの最後のチェックサム。
- 長所:シンプル。
- 短所:信頼できません。不明な回復時間。
2)バイトスタッフィング:
- 長所:信頼性が高く高速な回復で、どのハードウェアでも使用可能
- 短所:固定サイズのフレームベースの通信には適していません
3)9番目のビットマーキング -各バイトに追加ビットを追加します。SOFでマークされたSOF 1
とデータバイトには次のマークが付けられ0
ます。
- 長所:信頼性が高く、高速な回復
- 短所:ハードウェアサポートが必要です。ほとんどの
PC
ハードウェアおよびソフトウェアでは直接サポートされていません。
4)8番目のビットマーキング -上記の一種のエミュレーション。9番目ではなく8番目のビットを使用し、各データワードに7ビットのみを残します。
- 長所:信頼性の高い高速リカバリは、どのハードウェアでも使用できます。
- 短所:従来の8ビット表現と7ビット表現の間のエンコード/デコードスキームが必要です。やや無駄だ。
5)タイムアウトベース -定義されたアイドル時間の後に来る最初のバイトとしてSOFを想定します。
- 長所:データオーバーヘッドなし、シンプル。
- 短所:それほど信頼できません。Windows PCなどのタイミングの悪いシステムではうまく動作しません。潜在的なスループットのオーバーヘッド。
質問: 問題に対処するために存在する他の可能な技術/解決策は何ですか?上記のリストで簡単に回避できる短所を指摘できますか?システムプロトコルをどのように設計しますか(または設計しますか)?