Данные передаются фреймами. Протокол является адресным, с поддержкой широковещательных запросов и проверкой соответствия полученного ответа отправленному запросу.
Формат фрейма
Максимальный размер фрейма составляет 255 байт, общий размер технической полей фрейма - 10 байт. Таким образом, максимально возможный размер полезных данных возможен до 245 байт.
Поле | ADDRESS | FN | LEN | PAYLOAD | ID | CRC |
Формат | BCD MSB | UINT8 | UINT8 | BLOB | UINT16 | UINT16 |
Размер | 4 | 1 | 1 | 0...245 | 2 | 2 |
Для многобайтовых полей по умолчанию (если не указано явно) используется прямой порядок байт (LSB). Поля FLOAT32 и FLOAT64 являются числами IEEE.754 одинарной и двойной точности соответственно.
Описание полей:
- ADDRESS - адрес конечного устройства. Значение 0x00000000 является широковещательным адресом и указывается только в запросе. Ответ на широковещательный запрос будет содержать конкретный адрес конечного устройства.
- FN - функция (код запроса). Значение 0x00 зарезервировано под ответ с кодом ошибки.
- LEN - общая длина фрейма в байтах (включая сам байт длины). Допустимы значения от 10 до 255.
- PAYLOAD - полезные данные. Содержимое зависит от указанного кода запроса.
- ID - идентификатор запроса. Псевдослучайное число, генерируемое мастером при формировании запроса. Конечное устройство должно ответить тем же значением.
- CRC - контрольная сумма фрейма. При формировании фрейма считается от всех данных, исключая само поле контрольной суммы.
Параметры и расчет контрольной суммы
Характеристики:
- Стандарт: CRC-26-IBM.
- Полином: 0xA001.
- Начальное значение: 0xFFFF.
- Начинать с: LSB.
- XOR в конце: нет.
#include <stddef.h> #include <stdint.h> uint16_t crc(void const *data, size_t size) { uint8_t i; uint16_t result = 0xFFFF; uint8_t const *buf = (uint8_t const *)data; while (size--) { result ^= *buf++; for (i = 0; i < 8; i++) result = (result & 1) ? (result >> 1) ^ 0xA001 : result >> 1; } return result; }
При валидации входящего фрейма удобно считать контрольную сумму от всех байт, включая само поле контрольной суммы. В случае верного значения контрольной суммы результат вычислений должен быть равен 0x0000.
Алгоритм валидации входящего фрейма для конечного устройства
Ниже представлена блок-схема алгоритма валидации:
Алгоритм валидации входящего фрейма для мастера
Ниже представлена блок-схема алгоритма валидации: