Бит чётности
Бит чётности — простейшая проверка ошибок при передаче данных: к каждому символу добавляется один бит, который делает число единиц чётным или нечётным. Приёмник пересчитывает его и замечает, если один бит исказился.
Обновлено Редакция GAW
Бит чётности (parity bit) — дополнительный бит, который передатчик добавляет к символу так, чтобы общее число единиц в данных и в этом бите было чётным (even parity) или нечётным (odd parity). Приёмник пересчитывает чётность и при несовпадении выставляет флаг ошибки. В UART бит чётности идёт после бит данных перед стоп-битом, а его наличие и вид обозначают средней буквой формата кадра: 8N1 — без чётности, 8E1 — чётная, 8O1 — нечётная.
Как считается
Аппаратно бит чётности — исключающее ИЛИ всех бит данных; для нечётной чётности результат инвертируется (ATmega328P, раздел 20.4.1).
| Символ | Единиц в данных | Бит в 8E1 | Бит в 8O1 |
|---|---|---|---|
| «U» = 0x55 | 4 | 0 | 1 |
| 0x07 | 3 | 1 | 0 |
| 0x00 | 0 | 0 | 1 |
Реже встречаются режимы mark и space (stick parity): бит чётности передаётся как постоянная 1 или 0. Кадр со старт-битом, данными, чётностью и стоп-битами для своих настроек нарисует конструктор кадра UART, а подробно о формате кадра — в статье об интерфейсе UART.
Ограничения
Чётность ловит любое нечётное число искажённых бит в символе, но пропускает два, четыре и любое чётное число. Поэтому на уровне пакета протоколы добавляют более сильную проверку — в Modbus RTU это 16-битный CRC, который обнаруживает гораздо больше видов ошибок.
Частые вопросы
Что значит формат 8E1 и 8N1?
Число бит данных, тип чётности и число стоп-битов. 8N1 — восемь бит данных, без чётности (none), один стоп-бит; 8E1 — восемь бит, чётная (even) чётность, один стоп-бит; 8O1 — нечётная (odd). Modbus RTU по спецификации по умолчанию использует 8E1, а без чётности требует два стоп-бита — 8N2.
Как посчитать бит чётности?
Исключающее ИЛИ всех бит данных даёт 1, если единиц нечётное число. При чётной чётности это и есть бит чётности — он дополняет число единиц до чётного; при нечётной результат инвертируют. В символе «U» = 0x55 четыре единицы, поэтому бит чётности в формате 8E1 равен 0, а в 8O1 — 1.
Какие ошибки бит чётности не обнаруживает?
Любое чётное число искажённых бит: если перевернулись два бита, сумма по модулю 2 не меняется, и приёмник ошибки не заметит. Поэтому протоколы добавляют проверку на уровне пакета: Modbus RTU — CRC, Modbus ASCII — LRC.
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — 20.4.1 — бит чётности: исключающее ИЛИ бит данных, для нечётной чётности — инверсия
- Modbus Organization. MODBUS over Serial Line Specification and Implementation Guide V1.02 — чётность по умолчанию — even, без чётности — два стоп-бита; LRC в режиме ASCII
- Texas Instruments. TL16C550C Asynchronous Communications Element with Autoflow Control (SLLS177I), 2021 — stick parity: бит чётности как постоянная 1 или 0; флаг ошибки чётности PE
Нашли ошибку?