Кадрирование (framing)
UART, USB CDC или радиомодуль отдают программе просто поток байтов. Где кончается одна команда и начинается следующая, приёмник должен понять сам. Правило, по которому он это делает, называют кадрированием, и от него зависит, как быстро протокол восстановится после сбоя.
Обновлено Редакция GAW
Кадрирование (framing) — правило, по которому приёмник выделяет отдельные сообщения из непрерывного потока байтов. UART сам гарантирует только границы символа — старт-бит и стоп-бит; где кончается команда из десяти байтов, он не знает. Это решает протокол поверх него.
Три способа
| Способ | Как приёмник находит границу | Пример |
|---|---|---|
| Пауза | тишина на линии дольше заданного времени | Modbus RTU: 3,5 символа |
| Разделитель | особый байт, который не встречается в данных | SLIP, COBS, Modbus ASCII |
| Поле длины | заголовок говорит, сколько байтов следует | многие двоичные протоколы |
Пауза. Спецификация Modbus RTU отделяет кадры тишиной не короче 3,5 символа, а паузу длиннее 1,5 символа внутри кадра считает ошибкой; подробнее — в статье о межкадровой паузе. Способ не тратит ни одного байта, но требует, чтобы паузы доходили до приёмника без искажений.
Разделитель. Кадр заканчивается (а иногда и начинается) особым байтом. Modbus ASCII использует для этого двоеточие в начале и CR LF в конце, а данные передаёт шестнадцатеричными символами, так что разделители в них не появляются. Двоичные протоколы применяют байт-стаффинг: RFC 1055 описывает SLIP как протокол, который определяет только символы, обрамляющие пакет, и больше ничего.
Поле длины. Заголовок с числом байтов позволяет сразу выделить буфер нужного размера. Слабое место — повреждённая длина: приёмник отсчитает не те байты и потеряет синхронизацию, поэтому длину сочетают с маркером начала, таймаутом и контрольной суммой заголовка.
Восстановление после сбоя
Хорошее кадрирование позволяет приёмнику найти следующую границу, даже если предыдущий кадр испорчен. При паузе это следующая тишина, при разделителе — следующий байт-разделитель. Проверку целостности самого содержимого выполняют отдельно, обычно с помощью CRC в конце кадра. Байты удобно складывать в кольцевой буфер из прерывания, а кадры выделять в основном цикле. Разборщик со всеми тремя способами — в статье о реализации протоколов, разбор кадра Modbus — в калькуляторе Modbus RTU.
Не путать с ошибкой кадра UART: та относится к одному символу, у которого не нашёлся стоп-бит.
Частые вопросы
Какой способ кадрирования выбрать для своего протокола по UART?
Если линия прямая и паузы между кадрами гарантированы, проще всего пауза, как в Modbus RTU. Если байты идут через USB CDC, Bluetooth-модуль или другой буферизующий канал, паузы размываются, и надёжнее разделитель с байт-стаффингом (SLIP или COBS). Поле длины удобно при больших кадрах, но после ошибки в самой длине приёмник теряет синхронизацию, поэтому его обычно сочетают с маркером начала и CRC.
Чем кадрирование отличается от ошибки кадра UART?
Ошибка кадра (framing error) — аппаратный признак уровня одного символа: на месте стоп-бита приёмник увидел ноль. Кадрирование протокола — уровень выше: как из правильно принятых символов собрать сообщения. Слово «кадр» здесь означает разные вещи.
Почему Modbus RTU отделяет кадры паузой 3,5 символа?
Потому что в RTU данные двоичные и могут содержать любые байты, отдельного разделителя нет. Спецификация задаёт тишину не короче 3,5 символа между кадрами и считает кадр неполным, если внутри него пауза длиннее 1,5 символа. На скоростях выше 19 200 бит/с вместо расчётных значений рекомендуются фиксированные 750 мкс и 1,75 мс.
Источники
- Modbus Organization. MODBUS over Serial Line Specification and Implementation Guide V1.02, 2006 — разд. 2.5.1.1: в режиме RTU кадры разделяются тишиной не короче 3,5 символа (t3,5); пауза больше 1,5 символа внутри кадра делает его неполным; выше 19 200 бит/с рекомендуются фиксированные 750 мкс и 1,750 мс; разд. 2.5.2.1 и 2.5.2.2: в режиме ASCII кадр начинается двоеточием и заканчивается CR LF, контрольная сумма LRC
- J. Romkey. RFC 1055: A Nonstandard for Transmission of IP Datagrams over Serial Lines: SLIP, June 1988 — SLIP — только протокол кадрирования: определяет последовательность символов, обрамляющих IP-пакет на последовательной линии, и больше ничего
- S. Cheshire, M. Baker. Consistent Overhead Byte Stuffing. IEEE/ACM Transactions on Networking, vol. 7, no. 2, April 1999 — назначение байт-стаффинга — преобразовать пакет так, чтобы зарезервированное значение можно было использовать для однозначного обозначения границ пакетов
Нашли ошибку?
Смотрите также
- Реализация протокола обменаКадры по паузе, длине и разделителю, COBS, CRC-16, таймауты, разбор потока
- Паузы t1,5 и t3,5 в Modbus RTUТишина между кадрами и допустимый разрыв внутри кадра
- SLIPКадрирование по RFC 1055: разделитель END и экранирование ESC
- COBSБайт-стаффинг без нулей в данных с гарантированными накладными расходами
- Байт-стаффингПерекодирование данных, чтобы разделитель кадра в них не встречался
- Ошибка кадра UARTНоль на месте стоп-бита: причины, флаги FE, связь с break
- Modbus RTU: кадрыЗапрос с CRC, разбор ответа, float, адреса 4xxxx