Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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

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

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

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

Для многобайтовых полей по умолчанию (если не указано явно) используется прямой порядок байт (LSB). Поля FLOAT32 и FLOAT64 являются числами IEEE.754 одинарной и двойной точности соответственно.

...

  • ADDRESS - адрес конечного устройства. Значение 0x00000000 является широковещательным адресом и указывается только в запросе. Ответ на широковещательный запрос будет содержать конкретный адрес конечного устройства.
  • FN - функция (код запроса). Значение 0x00 зарезервировано под ответ с кодом ошибки.
  • LEN - общая длина фрейма в байтах (включая сам байт длины). Допустимы значения от 10 до 255.
  • PAYLOAD - полезные данные. Содержимое зависит от указанного кода запроса.
  • ID - идентификатор запроса. Псевдослучайное число, генерируемое мастером при формировании запроса. Конечное устройство должно ответить тем же значением.
  • CRC - контрольная сумма фрейма. При формировании фрейма считается от всех данных, исключая само поле контрольной суммы.

Параметры и расчет контрольной суммы

Характеристики:

  • Стандарт: CRC-26-IBM.
  • Полином: 0xA001.
  • Начальное значение: 0xFFFF.
  • Начинать с: LSB.
  • XOR в конце: нет.
Code Block
languagecpp
titleПример кода на языке C89
#include < stddef<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;
}
Info

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

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

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

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

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

...