У меня есть программа Java, которая постоянно прослушивает сообщения определенного формата на последовательном порту. Когда приложение-отправитель не отправляет сообщения, оно отправляет контрольные сообщения в следующем формате:
- байт 1: 1
- байт 2: 0xFE
- байт 3: 0xED
- байты 4-255: 0
Если приложение-получатель запускается раньше отправителя, все работает правильно, однако, если отправитель посылал сообщения пульса, почти наверняка получатель при запуске начнет слушать в середине сообщения сердцебиения (что является проблемой). потому что я читаю кусками по 255 байт, поскольку каждое сообщение закодировано Ридом-Соломоном). Я написал функцию синхронизации, которая представляет собой простой конечный автомат. Он считывает по 1 байту за раз при следующих условиях:
Если я только что прочитал 1: переключитесь в состояние NEW_MESSAGE.
Если я только что прочитал 0xFE: переключитесь в состояние POTENTIAL_HEARTBEAT.
Если я только что прочитал 0xED: переключиться в состояние HEARTBEAT
Имеются соответствующие проверки, чтобы гарантировать, что эти состояния не могут быть получены не по порядку, и как только я достиг состояния HEARTBEAT, я считываю оставшиеся 252 0 и предполагаю, что приемник был синхронизирован. На данный момент при тестировании этот синхронизатор работал неправильно, несмотря на то, что для эффективного запуска синхронизации посылались правильные байты. Мой вопрос таков: есть ли лучший способ синхронизации последовательной связи, потому что мне совсем не нравится мой метод.