Проблемы синхронизации команд on-the-fly
В этом разделе описано тонкое различие во времени между командами on-the-fly out-of-band и inband (относительно данных, отправляемых VSP).
В некоторых последовательных системах передача данных ПК синхронизирована с переключением выходов RTS или DTR (или с изменением настроек последовательного порта). Рассмотрим два примера:
Пример 1: линия RTS используется, чтобы отмечать начало и конец передачи данных ПК.
Диаграмма такой передачи показана ниже. Когда ПК хочет отправить данные, он делает следующее:
- Устанавливает линию RTS в HIGH.
- Передаёт данные.
- Устанавливает линию RTS в LOW.
Говорят, что положительный импульс на линии RTS охватывает (инкапсулирует) данные.

Пример 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!

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