Ошибка OSDP NAK 0x03: Ошибка длины пакета (Packet Length Error in Header)
Архитектура формирования длины кадра в OSDP и причины ошибки 0x03
По стандарту SIA OSDP поля LEN_LSB (байт 2) и LEN_MSB (байт 3) определяют полную длину кадра в байтах, включая маркер начала SOM (0x53), байты длины, адрес, байт управления, поле данных и завершающую контрольную сумму/CRC (16 бит). Ошибка NAK 0x03 (Packet Length Error in Header) генерируется в трех случаях: 1) Значение длины в заголовке меньше минимально допустимого (меньше 5 байт для Checksum или 6 байт для CRC/SCB); 2) Фактически принятое количество байт до таймаута меньше или больше числа, указанного в заголовке LEN; 3) Значение LEN превышает максимальный размер буфера приема (обычно 128 или 1440 байт для пакетов osdp_RAW / osdp_FMT).
Бизнес-риски
Потеря пакетов с номерами считанных карт (события osdp_RAW), обрыв загрузки конфигураций в считыватели, увеличение задержки открытия двери из-за постоянных тайм-аутов шины RS-485.
Анатомия заголовка OSDP пакета
| Поле | Размер | Описание |
|---|---|---|
SOM | 1 байт | Фиксированный синхробайт 0x53 (Start of Message). |
ADDR | 1 байт | Адрес считывателя (0x00–0x7F, 0x7F — Broadcast). |
LEN_LSB | 1 байт | Младший байт общей длины сообщения. |
LEN_MSB | 1 байт | Старший байт общей длины сообщения ($Length = LSB + MSB imes 256$). |
Методика устранения ошибки OSDP NAK 0x03
Сценарий 1: Диагностика переполнения буфера UART и дребезга линии
Ошибка часто возникает, когда байты кадра «склеиваются» или теряются из-за прерываний в контроллере или нестабильной скорости UART:
# Проверка ошибок переполнения (Overrun / Frame Errors) интерфейса UART на контроллере под Linux
cat /proc/tty/driver/serial
# Пример вывода с ошибками:
# 0: uart:16550A port:000003F8 irq:4 tx:1240 rx:1100 oe:14 fe:28 brk:2
# oe (Overrun Error) и fe (Frame Error) указывают на проблему тактирования или переполненияСценарий 2: Проверка соответствия максимального размера блока (Max Packet Size)
Если контроллер пытается отправить длинные сертификаты или кастомные данные карты (например, Mifare Plus / Desfire EV2/EV3 свыше 64 байт):
- Проверьте максимальный размер блока данных в ответе считывателя
osdp_PDCAP(параметр Receive Buffer Size). - В настройках СКУД установите ограничение максимального размера PDU (Protocol Data Unit) до 128 байт, включив фрагментацию сообщений (Multi-part Message Handling).
Сценарий 3: Настройка тайм-аута межсимвольного интервала (Inter-byte Timeout)
В протоколе OSDP межсимвольный интервал не должен превышать 20 миллисекунд (или времени передачи 2 байт на текущей скорости). Если интервал превышен, стек считывателя сбрасывает приемный автомат и фиксирует ошибку длины. Отрегулируйте тайминги polling-цикла контроллера.
Типовые ошибки администраторов
- Подключение к шине RS-485 устройств с разными скоростями (Baud Rate): Например, часть считывателей работает на 9600 bps, а контроллер пытается общаться на 38400 bps, что приводит к мусору в UART и фантомным значениям LEN.
- Использование программного UART (Bit-Banging) на слабых микроконтроллерах: Пропуск прерываний вызывает обрыв приема кадров на лету.
Инженеры ITSTM проведут осциллографический анализ фронтов сигналов RS-485, настроят буферы UART контроллеров и гарантируют отсутствие потери пакетов.
Частые вопросы (FAQ)
Какой минимальный размер валидного OSDP пакета?
Минимальный пакет (например, osdp_POLL) с 8-битной контрольной суммой составляет 6 байт: SOM (1) + ADDR (1) + LEN (2) + CTRL (1) + CMD (1) + CKSUM (1).
Почему ошибка NAK 0x03 появляется только при чтении длинных смарт-карт (DESFire)?
Чтение защищенных приложений DESFire формирует длинные кадры данных (osdp_RAW). Если размер буфера считывателя в ACU сконфигурирован неверно, пакет обрезается на границе буфера.
Влияет ли длина кабеля на возникновение NAK 0x03?
Да, из-за емкости кабеля фронты импульсов заваливаются, вызывая сбои в UART-приемнике (Framing Errors), из-за чего контроллер считывает некорректные биты в поле LEN_LSB.
Что означает широковещательный адрес 0x7F в контексте ошибки длины?
Кадры на адрес 0x7F (Broadcast) не должны вызывать отправку NAK от периферийных устройств во избежание коллизий на общей шине RS-485.