Синхронизация соединения последовательного порта Java с использованием RXTX - PullRequest
1 голос
/ 16 августа 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 19 августа 2010

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

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

0 голосов
/ 16 августа 2010

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

...