Проблемы синхронизации команд on-the-fly

В этом разделе описано тонкое различие во времени между командами on-the-fly out-of-band и inband (относительно данных, отправляемых VSP).

В некоторых последовательных системах передача данных ПК синхронизирована с переключением выходов RTS или DTR (или с изменением настроек последовательного порта). Рассмотрим два примера:

Пример 1: линия RTS используется, чтобы отмечать начало и конец передачи данных ПК.

Диаграмма такой передачи показана ниже. Когда ПК хочет отправить данные, он делает следующее:

  • Устанавливает линию RTS в HIGH.
  • Передаёт данные.
  • Устанавливает линию RTS в LOW.

Говорят, что положительный импульс на линии RTS охватывает (инкапсулирует) данные.

Синхронизация RTS и данных (JPG)

Пример 2: биты чётности mark и space используются последовательным устройством, чтобы отличать байты адреса от байтов данных, передаваемых ПК.

В большинстве систем RS485 (где к последовательной шине подключено несколько последовательных устройств) ПК должен выбрать определённый «узел», с которым хочет работать, передав его адрес. Такие системы часто используют бит чётности, чтобы отличить адрес узла от данных, то есть parity = mark означает байт адреса, а parity = space - байт данных, или наоборот.

Так как стандартный драйвер COM не позволяет прикладному ПО напрямую управлять битом чётности, такое ПО использует следующий алгоритм для передачи адреса узла и данных:

  • Переключить чётность на mark.
  • Отправить адрес узла.
  • Переключить чётность на space.
  • Отправить данные для этого узла.

Важно, что изменения режима чётности должны быть синхронизированы с отправляемыми данными.

Как использование VSP влияет на синхронизацию ****

Работа VSP более асинхронна, чем работа стандартного последовательного порта. Когда приложение отправляет данные, VSP просто помещает их в буфер Tx и возвращает управление приложению. Для приложения это означает, что данные отправлены. На самом деле это не так: между отправкой и фактическим появлением данных на последовательном порту DS проходит некоторая задержка.

Команды out-of-band (например, команда, которая велит DS изменить состояние линии RTS) отправляются отдельно от данных. Например, когда приложение велит VSP изменить состояние линии RTS, VSP немедленно отправляет нужную команду out-of-band.

Для примера 1 это означает, что импульс на линии RTS окажется полностью не синхронизирован с самими последовательными данными (диаграмма ниже это иллюстрирует). Для примера 2 это означает, что переключение режима чётности произойдёт в неправильные и непредсказуемые моменты, и нет гарантии, что байт адреса будет выведен с битом чётности mark, а байт данных - с битом чётности space!

Рассинхронизация данных и RTS (JPG)

Решение

К счастью, у проблемы есть решение: используйте режим inband, если нужна полная синхронизация между данными Tx и командами on-the-fly! Так как команды on-the-fly inband встраиваются непосредственно в поток данных, нет риска, что они каким-то образом «обгонят» данные. DS получит данные и соответствующие команды on-the-fly в точно таком же порядке, в каком их сформировало приложение.