0

ステート マシンを再起動する方法を見つけるのに苦労しています。言い換えれば、私が持っているものの一部:

電源を入れると0.5秒のデバウンス時間の間留まり、ステートマシンに入るモジュールがあります。最初に文字列#anotherstring#を送信し、次に彼は一定期間のタイマーを開始し、タイマーが経過すると変換しますアナログ信号/データ (SPI、I2C) を読み取り、そのデータに続いて別の # を送信します。ステート マシンは戻ってタイマーを再起動し、データを再送信します ...

別のチップで。そのモジュールから情報を受け取ります。これは、最初の文字列、2 番目の文字列を完成させ、バッファ内の値を何度も累積するステート マシンです。

ある瞬間、外部デバイスがデータを要求し、チップが計算を行って送信する瞬間があります。

ここまでは順調ですね。モジュールが切断されたときの部分を除いて、これのすべての部分が機能しています。OK、データが送信されない問題はないと言うかもしれません。はい、これは本当ですが、モジュールが接続されている場合はどうなりますか。今までの作業をテストするために、チップの切断をリセットしてモジュールを接続しました。これにより、チップは最初の状態になり、モジュールは最初の状態から移行し、すべて問題ありません。

私の質問は、デバイスがチップから切断されたときにチップ統計マシンを再起動し、string#anotherstring# の組み合わせ (最初の状態) を待機する方法を決定する方法です。

もう 1 つの問題は、電源が落ちたのではなく、通信が切断されているかどうかを判断する方法です。通信を元に戻すときは、データを再度送信する必要があります。両方のモジュールが初期化状態から移行することが望ましいです。

私が念頭に置いているのは、チップからモジュールに ack を送信することです。しかし、正確な方法はわかりません。基本的に私はこれを望んでいます:モジュールが切断されると、その状態マシンは明らかに最初からやり直し、もう一度やりたいチップの状態は初期状態に戻ります。モジュールの通信が切断された場合、両方のステートマシンが最初からやり直す方法があります。

私はこれで明確かどうかわかりません。質問があればお願いします。何か見つけたら編集していきます。

その他の情報: モジュールとチップはいくつかのマイクロコントローラーであり、通信は UART です。

4

1 に答える 1

0

受信側で使用できる基本的なスキームをスケッチしましょう。

受信側では、妥当な時間枠内に有効な/完全なメッセージが受信されない場合、タイムアウトする必要があります。このようにして、いつでも何らかの理由でモジュールがオフラインになったことを検出できます。

この場合、メッセージを受信して​​処理するステート マシンもリセットされます。これは、たとえば、データが受信されたときに開始され、メッセージが正しく完全に受信されたときに停止するタイマーがあることを意味します。タイマーがタイムアウトすると、現在受信されているメッセージは無効であると宣言されて破棄され、受信者は最初に戻って次のメッセージを探します。

次に、メッセージの開始および/または終了を検出するコードをレシーバーに実装する必要があります。したがって、モジュールが常に送信によって開始される場合、受信者は、たとえばstring#anotherstring#、受信するまで待機します。string#それ以外の受信は受信者によって無視されます。予想されるプレフィックスが検出された後にのみ、残りのメッセージ受信が行われます。

プロセス全体で、受信者のメッセージ タイムアウト タイマーがアクティブになり、メッセージの一部が時間内に受信されない場合、受信者は送信の問題を想定し、次のメッセージの開始を待機する状態に戻ります。

于 2014-06-12T15:24:39.110 に答える