シリアルポートで特定の形式のメッセージを継続的にリッスンするJavaプログラムがあります。送信者アプリケーションがメッセージを送信していない場合、次の形式でハートビートメッセージを送信します。
- バイト1:1
- バイト2:0xFE
- バイト3:0xED
- バイト4-255:0
受信者アプリケーションが送信者の前に開始された場合、すべてが正しく機能しますが、送信者がハートビートをスローしている場合、受信者が開始されると、ハートビートメッセージの途中でリッスンを開始することはほぼ確実です(これは問題です)各メッセージがリードソロモン符号化されているため、255バイトのチャンクで読み取ったためです)。単純なステートマシンである同期関数を作成しました。次の条件で一度に1バイトを読み取ります。
1:を読んだだけの場合は、NEW_MESSAGE状態に切り替えます。
0xFEを読み取ったばかりの場合:POTENTIAL_HEARTBEAT状態に切り替えます。
0xEDを読んだばかりの場合:HEARTBEAT状態に切り替えます
これらの状態が順不同で到達できないことを確認するために関連するチェックが行われ、HEARTBEAT状態に達したら、残りの252 0を読み取り、レシーバーが同期されていると想定します。これまでのテストでは、同期を効果的にトリガーするために正しいバイトが送信されたにもかかわらず、このシンクロナイザーは正しく機能していませんでした。私の質問はこれです:私は自分の方法がまったく好きではないので、シリアル通信を同期するためのより良い方法はありますか?