Данные передаются фреймами. Протокол является адресным, с поддержкой широковещательных запросов и проверкой соответствия полученного ответа отправленному запросу.
Максимальный размер фрейма составляет 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 одинарной и двойной точности соответственно. |
Описание полей:
Характеристики:
#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. |
Ниже представлена блок-схема алгоритма валидации:
Ниже представлена блок-схема алгоритма валидации: