1

シリアルポートで特定の形式のメッセージを継続的にリッスンするJavaプログラムがあります。送信者アプリケーションがメッセージを送信していない場合、次の形式でハートビートメッセージを送信します。

  • バイト1:1
  • バイト2:0xFE
  • バイト3:0xED
  • バイト4-255:0

受信者アプリケーションが送信者の前に開始された場合、すべてが正しく機能しますが、送信者がハートビートをスローしている場合、受信者が開始されると、ハートビートメッセージの途中でリッスンを開始することはほぼ確実です(これは問題です)各メッセージがリードソロモン符号化されているため、255バイトのチャンクで読み取ったためです)。単純なステートマシンである同期関数を作成しました。次の条件で一度に1バイトを読み取ります。

  • 1:を読んだだけの場合は、NEW_MESSAGE状態に切り替えます。

  • 0xFEを読み取ったばかりの場合:POTENTIAL_HEARTBEAT状態に切り替えます。

  • 0xEDを読んだばかりの場合:HEARTBEAT状態に切り替えます

これらの状態が順不同で到達できないことを確認するために関連するチェックが行われ、HEARTBEAT状態に達したら、残りの252 0を読み取り、レシーバーが同期されていると想定します。これまでのテストでは、同期を効果的にトリガーするために正しいバイトが送信されたにもかかわらず、このシンクロナイザーは正しく機能していませんでした。私の質問はこれです:私は自分の方法がまったく好きではないので、シリアル通信を同期するためのより良い方法はありますか?

4

2 に答える 2

1

問題は、実際にはビットの順序付けの重要性を忘れてしまったことです。私が読み取っていたバイトチャネルはリトルエンディアンだったので、16ビット整数の0xFEEDが0xFEoxEDではなく0xED0xFEとして表示されていました。状態チェックの簡単なスイッチで、すべてが桃色の王様になります。

コメントしてくれたすべての人に心から感謝します。

于 2010-08-19T15:42:54.197 に答える
0

ステートマシンを拡張し、受信した最後の3バイトを確認します。それらをハートビートメッセージの最初の3バイトに結合します。最初の3バイトは常に同じであるように見えるため、これを使用してハートビートメッセージの開始を検出し、同期を行うことができます。

于 2010-08-16T14:16:26.083 に答える