Перейти к содержанию

Бит чётности

Бит чётности — простейшая проверка ошибок при передаче данных: к каждому символу добавляется один бит, который делает число единиц чётным или нечётным. Приёмник пересчитывает его и замечает, если один бит исказился.

Обновлено Редакция GAW

Бит чётности (parity bit) — дополнительный бит, который передатчик добавляет к символу так, чтобы общее число единиц в данных и в этом бите было чётным (even parity) или нечётным (odd parity). Приёмник пересчитывает чётность и при несовпадении выставляет флаг ошибки. В UART бит чётности идёт после бит данных перед стоп-битом, а его наличие и вид обозначают средней буквой формата кадра: 8N1 — без чётности, 8E1 — чётная, 8O1 — нечётная.

Как считается

Аппаратно бит чётности — исключающее ИЛИ всех бит данных; для нечётной чётности результат инвертируется (ATmega328P, раздел 20.4.1).

СимволЕдиниц в данныхБит в 8E1Бит в 8O1
«U» = 0x55401
0x07310
0x00001

Реже встречаются режимы 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.

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — 20.4.1 — бит чётности: исключающее ИЛИ бит данных, для нечётной чётности — инверсия
  2. Modbus Organization. MODBUS over Serial Line Specification and Implementation Guide V1.02 — чётность по умолчанию — even, без чётности — два стоп-бита; LRC в режиме ASCII
  3. Texas Instruments. TL16C550C Asynchronous Communications Element with Autoflow Control (SLLS177I), 2021 — stick parity: бит чётности как постоянная 1 или 0; флаг ошибки чётности PE

Нашли ошибку?