2016-09-11 10 views
0

UARTインターフェイス(RS-232ではなく、制御ラインなし)を使用して2つのデバイスを配線しました。 制限されたAPIとハードウェアアクセスのために、 伝送方式を変更する方法はありません(パリティまたはストップビットの設定を変更するなど)。 私が持っているのは、2つのデバイス間でバイトを転送する可能性だけです。UART通信を使用する2つのデバイスの同期

1つのデバイスがマスタ、(定義された状態にそれを設定)接続 を開始コマンドを 対応する回答で応答する2つのクライアントを送信するように作用します。実際のプロトコルは私に任されますが、引数なしのいくつかのコマンド、定義された長さ(例えば3バイト)の引数 と任意の長さのバイナリデータ送信を含むべきです。

最初のバイトにコマンド番号とフラグとしてエンコードされたパラメータの量と種類が含まれている単純なプロトコルを定義しました。そのため、クライアントは単純なステートマシンとして実装できます。

私の問題は、マスターは(原因クラッシュに例えば)接続を失った場合、クライアントは、現在のコマンドの引数やのデータを待って であれば、 それは、クライアントをリセットし、定義された状態にそれを持って来ることができないということであり、バイナリ伝送。

「ブラックリスト」を使用している人がいます。バイト0xFFをリセット コマンドとして定義しましたが、これは任意の バイナリ転送の私の要件を破ります(またはデータを再エンコードする必要があります)。

は、あなたがそれをマスター は関係なく、それが現在(それが既に受け取ったものを) にあるもの状態クライアントをリセットしないことができますので、私は、プロトコルを定義することができますどのように他のアイデアを持っていますか?

+0

厳しいタイミング要件はありますか? –

+0

一部のプロトコルでは、この目的で6つの0x00または0xFFのシーケンスが使用されます。また、コマンドにチェックサムを追加することもできます。リセットコマンドと他のコマンドを区別することができます。 –

+0

@HelenDownsしかし、どのように私は現在のデータに属しているか、リセットされている6バイトの間にdistisingish?私がチェックサムを追加したとしても、それはバイナリ送信のランダムなパターンかもしれません、またはポイントがありませんか? – muffel

答えて

1

受信データのない初期状態ではない一定時間が経過した後にクライアントをリセットするようにプログラムすることができます。再起動すると、マスタは最初のコマンドを送信する前に若干長い時間待機し、クライアントが通信の開始時に正しい状態になることを保証します。また、(再)起動時に送信された初期ステータスコマンドを実装して、以前の送信がタイムアウトしたか、正しく受信されたかどうかを確認することもできます。

共有クロックソースがない場合は、十分なマージンを持つUARTビット時間でタイムアウトを測定するか、タイムアウトを数桁以上、たとえば1秒に設定することができます。

単純な方法ですが、このアプローチでは、何らかの理由でアプリケーションがマスタ初期化シーケンスの一部として実行される待機によって損なわれる厳しいタイミング要件を持っている場合、慎重に検討する必要があります。

関連する問題