2016-09-11 3 views
0

Я подключил два устройства с использованием интерфейса UART (не RS-232, поэтому никаких линий управления). Из-за ограниченных API-интерфейсов и доступа к аппаратным средствам нет возможности изменить схему передачи (например, изменить настройки четности или стопового бита). Итак, у меня есть возможность передавать байты между двумя устройствами.Синхронизация двух устройств с использованием связи UART

Одно устройство действует как мастер, должен инициировать соединение (установить его в определенное состояние), посылать команды два клиента, который отвечает соответствующий ответ. Фактический протокол зависит от меня, но он должен включать в себя несколько команд без аргументов, аргументы определенной длины (например, 3 байта) и двоичную передачу данных произвольной длины.

Я определил простой протокол, в котором первые байты содержат номер команды и количество и тип параметров, закодированных как флаги, поэтому клиент может быть реализован как простой конечный автомат.

Моя проблема в том, что если хозяин теряет соединение (например, из-за аварии), он не может сбросить клиента и привести его в определенное состояние, если клиент в настоящее время ждет аргументов команды или данных двоичная передача.

Некоторые люди использовали «черный список» и, например, определил байт 0xFF как сброс команды везде, где бы он ни появлялся, но это нарушило бы мое требование произвольных двоичных передач (или мне пришлось бы перекодировать данные).

У вас есть какие-либо другие идеи, как я могу определить протокол, так что позволяет мастеру чтобы сбросить клиент, независимо от того, что состояния в настоящее время он находится в (что он уже получил)?

+0

У вас строгие требования к срокам? –

+0

В некоторых протоколах для этой цели используется последовательность из шести 0x00 или 0xFF. Кроме того, вы можете добавить контрольную сумму в свои команды. Это позволит отличать команду сброса от других. –

+0

@HelenDowns, но как я могу отвлечься между шестью байтами, принадлежащими текущим данным или сбросом? Даже если бы я добавил контрольную сумму, это может быть случайный шаблон в двоичной передаче, или я пропущу точку? – muffel

ответ

1

Вы можете запрограммировать клиента на перезагрузку после определенного количества времени, прошедшего в не начальном состоянии без входящих данных. После перезапуска мастер будет ждать немного больше времени перед отправкой первой команды, тем самым гарантируя, что клиент будет в правильном состоянии в начале сообщения. Вы также можете захотеть реализовать начальную команду состояния, отправленную при загрузке (повторной), чтобы проверить, была ли предыдущая передача или выполнена правильно.

Если отсутствует общий источник синхронизации, вы можете либо измерить тайм-аут в битах бит UART с достаточным запасом, либо установить тайм-аут на несколько порядков выше, чем, например, 1 с.

Как бы ни был прост, этот подход требует тщательного рассмотрения, если по какой-либо причине приложение имеет строгие требования к синхронизации, которые были бы скомпрометированы ожиданием, выполняемым как часть последовательности инициализации мастера.

 Смежные вопросы

  • Нет связанных вопросов^_^