UARTインターフェイス(RS-232ではなく、制御ラインなし)を使用して2つのデバイスを配線しました。 制限されたAPIとハードウェアアクセスのために、 伝送方式を変更する方法はありません(パリティまたはストップビットの設定を変更するなど)。 私が持っているのは、2つのデバイス間でバイトを転送する可能性だけです。UART通信を使用する2つのデバイスの同期
1つのデバイスがマスタ、(定義された状態にそれを設定)接続 を開始コマンドを 対応する回答で応答する2つのクライアントを送信するように作用します。実際のプロトコルは私に任されますが、引数なしのいくつかのコマンド、定義された長さ(例えば3バイト)の引数 と任意の長さのバイナリデータ送信を含むべきです。
最初のバイトにコマンド番号とフラグとしてエンコードされたパラメータの量と種類が含まれている単純なプロトコルを定義しました。そのため、クライアントは単純なステートマシンとして実装できます。
私の問題は、マスターは(原因クラッシュに例えば)接続を失った場合、クライアントは、現在のコマンドの引数やのデータを待って であれば、 それは、クライアントをリセットし、定義された状態にそれを持って来ることができないということであり、バイナリ伝送。
「ブラックリスト」を使用している人がいます。バイト0xFFをリセット コマンドとして定義しましたが、これは任意の バイナリ転送の私の要件を破ります(またはデータを再エンコードする必要があります)。
は、あなたがそれをマスター は関係なく、それが現在(それが既に受け取ったものを) にあるもの状態クライアントをリセットしないことができますので、私は、プロトコルを定義することができますどのように他のアイデアを持っていますか?
厳しいタイミング要件はありますか? –
一部のプロトコルでは、この目的で6つの0x00または0xFFのシーケンスが使用されます。また、コマンドにチェックサムを追加することもできます。リセットコマンドと他のコマンドを区別することができます。 –
@HelenDownsしかし、どのように私は現在のデータに属しているか、リセットされている6バイトの間にdistisingish?私がチェックサムを追加したとしても、それはバイナリ送信のランダムなパターンかもしれません、またはポイントがありませんか? – muffel