Синхронизация соединения последовательного порта Java с использованием RXTX

У меня есть программа Java, которая постоянно прослушивает сообщения определенного формата на последовательном порту. Когда приложение-отправитель не отправляет сообщения, оно отправляет контрольные сообщения в следующем формате:

  • байт 1: 1
  • байт 2: 0xFE
  • байт 3: 0xED
  • байты 4-255: 0

Если приложение-получатель запускается раньше отправителя, все работает правильно, однако, если отправитель посылал сообщения пульса, почти наверняка получатель при запуске начнет слушать в середине сообщения сердцебиения (что является проблемой). потому что я читаю кусками по 255 байт, поскольку каждое сообщение закодировано Ридом-Соломоном). Я написал функцию синхронизации, которая представляет собой простой конечный автомат. Он считывает по 1 байту за раз при следующих условиях:

  • Если я только что прочитал 1: переключитесь в состояние NEW_MESSAGE.

  • Если я только что прочитал 0xFE: переключитесь в состояние POTENTIAL_HEARTBEAT.

  • Если я только что прочитал 0xED: переключиться в состояние HEARTBEAT

Имеются соответствующие проверки, чтобы гарантировать, что эти состояния не могут быть получены не по порядку, и как только я достиг состояния HEARTBEAT, я считываю оставшиеся 252 0 и предполагаю, что приемник был синхронизирован. На данный момент при тестировании этот синхронизатор работал неправильно, несмотря на то, что для эффективного запуска синхронизации посылались правильные байты. Мой вопрос таков: есть ли лучший способ синхронизации последовательной связи, потому что мне совсем не нравится мой метод.


person JDS    schedule 16.08.2010    source источник
comment
Когда вы говорите, что это не сработало правильно, что вы имеете в виду? Конечно, вы можете записать трассировку ввода и переходов конечного автомата, чтобы определить, почему такой простой FSM дает сбой.   -  person Jim Garrison    schedule 17.08.2010


Ответы (2)


На самом деле проблема заключалась в том, что я просто забыл о важности порядка битов. Канал байтов, из которого я читал, был прямым порядком байтов, поэтому 16-битное целое число 0xFEED пришло ко мне как 0xED 0xFE вместо 0xFE oxED. С простым переключением в режиме проверки состояния все работает отлично.

Искреннее спасибо всем, кто прокомментировал.

person JDS    schedule 19.08.2010

Расширьте свой конечный автомат и проверьте последние 3 полученных байта. Сравните их с первыми 3 байтами сообщения пульса. Поскольку первые 3 байта кажутся всегда одинаковыми, вы можете использовать их для обнаружения начала сообщения пульса и выполнения синхронизации.

person Alex    schedule 16.08.2010
comment
Я должен читать по 1 байту за раз, так как нет способа узнать, где в конкретном сообщении сердцебиения я начинаю читать. Например, скажем, я начинаю читать следующие байты: 0 0 0 0 0 1 FE ED 0 0 0 Если я читаю по 3 байта за раз, я получаю [0,0,0] [0,0,1] [ FE,ED,0] ... и полностью пропустить сердцебиение. - person JDS; 16.08.2010
comment
его FSM уже проверяет последние 3 полученных байта благодаря наличию трех различных состояний (которые, как я предполагаю, являются дополнением к состоянию IDLE). - person Jim Garrison; 17.08.2010