Данные передаются фреймами. Протокол является адресным, с поддержкой широковещательных запросов и проверкой соответствия полученного ответа отправленному запросу.

Формат фрейма

Максимальный размер фрейма составляет 255 байт, общий размер технической полей фрейма - 10 байт. Таким образом, максимально возможный размер полезных данных возможен до 245 байт.

ПолеADDRESSFNLENPAYLOADIDCRC
ФорматBCD MSBUINT8UINT8BLOBUINT16UINT16
Размер4110...24522

Для многобайтовых полей по умолчанию (если не указано явно) используется прямой порядок байт (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.

Алгоритм валидации входящего фрейма для конечного устройства

Ниже представлена блок-схема алгоритма валидации:

Алгоритм валидации входящего фрейма для мастера

Ниже представлена блок-схема алгоритма валидации: