Протокол обмена
Версия 2. Полудуплекс, 19200 бод, 8N1. Ведущий один — шлюз, ведомых на линии до 31.
Формат кадра
+------+------+------+------+-----------+-----------+
| 0xA5 | ADDR | CMD | LEN | DATA[LEN] | CRC16 L,H |
+------+------+------+------+-----------+-----------+
1 б 1 б 1 б 1 б 0..64 б 2 б
ADDR— адрес станции 1…31; 0 — широковещательный, без ответа.CMD— код команды; в ответе старший бит установлен.CRC16— CCITT-FALSE (полином 0x1021, начальное 0xFFFF), считается отADDRдо конца данных, передаётся младшим байтом вперёд.- Пауза между кадрами — не менее 2 мс. Таймаут ответа — 50 мс.
Команды
| CMD | Название | Запрос | Ответ |
|---|---|---|---|
| 0x01 | PING | — | версия протокола, версия прошивки |
| 0x02 | READ_NOW | — | мгновенные значения, 8 байт |
| 0x03 | READ_AVG | окно, мин (1…60) | средние и порывы, 10 байт |
| 0x10 | GET_REG | номер регистра | значение uint16 |
| 0x11 | SET_REG | номер, значение | эхо |
| 0x20 | SAVE | — | код результата |
| 0x7F | RESET | магическое 0x5AA5 | нет |
Ответ READ_NOW
| Смещ. | Тип | Поле | Ед. |
|---|---|---|---|
| 0 | uint16 | скорость ветра | 0,01 м/с |
| 2 | uint16 | порыв за 3 с | 0,01 м/с |
| 4 | uint8 | румб, 0…15, С = 0, по часовой | — |
| 5 | uint8 | флаги: бит 0 — обледенение, бит 1 — ошибка флюгера | — |
| 6 | uint16 | напряжение питания | мВ |
Регистры настроек
| № | Параметр | Умолч. | Диапазон |
|---|---|---|---|
| 0 | адрес станции | 1 | 1…31 |
| 1 | коэффициент скорости, 0,001 м/с на Гц | 700 | 100…3000 |
| 2 | порог трогания, 0,01 м/с | 40 | 0…200 |
| 3 | смещение севера, градусы | 0 | 0…359 |
| 4 | период усреднения, с | 60 | 10…3600 |
Пример обмена
Опрос мгновенных значений станции с адресом 3:
# запрос: адрес 3, READ_NOW, без данных
A5 03 02 00 AE F3
# ответ: 7,24 м/с, порыв 9,80 м/с, румб 6 (ЮВ), флаги 0, 12,31 В
A5 03 82 08 D4 02 D4 03 06 00 16 30 07 12
Числовые поля передаются младшим байтом вперёд. Проверять CRC удобнее по этим примерам: если ваша реализация даёт те же значения, порядок байтов и инициализация выбраны верно.
Обработка ошибок
При неверной CRC станция молчит. На неизвестную команду или неверный аргумент она отвечает кадром с кодом 0xFF и одним байтом причины: 1 — нет такой команды, 2 — неверная длина, 3 — значение вне диапазона. Шлюз повторяет запрос до двух раз и лишь затем отмечает пропуск данных.