SBUS и IBUS: кадры и параметры
Протоколы в БАС: полный курс · Урок 13 из 18 · Модуль 5. Приёмники и радиоканалы
Как приёмник упаковывает 16 каналов в один провод: кадры SBUS и IBUS, скорости, форматы и флаги failsafe.
SBUS — это UART на 100000 бод с кадром 8E2 и инвертированными уровнями: в состоянии покоя на линии низкий уровень. С этим связаны все сложности с инверсией — их разбираем в следующем уроке.
Содержание
1. Цели урока
После этого урока вы сможете:
- называть параметры SBUS (100000 бод, 8E2, инверсия) и IBUS (115200 бод, 8N1)
- объяснять устройство 25-байтного кадра SBUS
- переводить 11-битные значения каналов в привычные 988–2012 мкс
- понимать роль флагов failsafe и lost frame
2. Зачем приёмнику один провод
Раньше каждый канал управления шёл от приёмника к полётному контроллеру отдельным проводом — восемь каналов, восемь проводов. Современный приёмник упаковывает все каналы в один цифровой поток: один провод вместо восьми, меньше соединений, меньше отказов. Два конкурирующих протокола сделали это стандартом: SBUS (придуман Futaba; используется FrSky, DJI и множеством производителей) и IBUS (FlySky). Оба — это UART с нестандартными параметрами, поэтому настройка порта так важна.
↑ К оглавлению3. SBUS: параметры и кадр
| Параметр | SBUS | IBUS | CRSF (для сравнения) |
|---|---|---|---|
| Физика | UART, один провод + 5V + GND | UART, один провод + 5V + GND | UART, два провода (TX+RX) + 5V + GND |
| Скорость | 100000 бод | 115200 бод | 420000 бод |
| Формат кадра | 8E2 (8 бит + чётный паритет + 2 стопа) | 8N1 | 8N1 |
| Полярность | инвертированный | обычный | обычный |
| Каналов | 16 пропорциональных + 2 цифровых | 14 пропорциональных | 16 пропорциональных + 2 цифровых |
| Период кадра | ~7–14 мс | ~7 мс | 2,5–6,7 мс (150–400 Гц у ELRS) |
Кадр SBUS — 25 байт каждые 7–14 мс: стартовый байт 0x0F, 22 байта данных (16 каналов по 11 бит), байт флагов, конечный байт 0x00.


Разбор кадра по байтам:
- Байт 0 = 0x0F — стартовый маркер: приёмник по нему находит начало кадра.
- Байты 1–22 — 176 бит = 16 каналов по 11 бит, упакованные подряд, без выравнивания по границам байтов.
- Байт 23 — флаги: биты 0–1 — цифровые каналы CH17 и CH18; бит 2 — lost frame (кадр потерян); бит 3 — failsafe (связь потеряна).
- Байт 24 = 0x00 — конечный маркер.
11 бит на канал дают диапазон 0–2047, где середина 1024 соответствует ~1500 мкс. Пересчёт в микросекунды, как это делает Betaflight: мкс = 988 + значение × (2012 − 988) / 2047. Одна единица ≈ 0,5 мкс — разрешение вдвое лучше, чем у классического PWM-входа.
4. IBUS: кадр FlySky
Кадр IBUS — 32 байта, приходит каждые ~7 мс:
- Байты 0–1 = 0x20 0x40 — стартовые маркеры.
- Байты 2–29 — 14 каналов по 2 байта, little-endian: младший байт первым. Значения сразу в микросекундах, 1000–2000 — без пересчёта.
- Байты 30–31 — контрольная сумма:
0xFFFF − сумма всех байтов после стартовых маркеров.
Для программистов IBUS проще: значения каналов читаются напрямую, без побитовой распаковки.
↑ К оглавлению5. Флаги failsafe: почему они важны
Флаги в кадре — страховка безопасности. Если радиосигнал пропал, приёмник выставляет failsafe в следующем же кадре, и полётный контроллер реагирует мгновенно — не дожидаясь таймаутов:
- ArduPilot: параметр
FS_THR_ENABLE = 1— возврат домой (RTL) при пропадании сигнала; режим задаётся также черезRCn_OPTIONS = 32(failsafe-режим для конкретного канала). - Betaflight: вкладка Failsafe — режим Stage 2: Drop (остановка моторов) или Land (посадка).
Проверка обязательна после каждой настройки: выключи пульт при подключённом аппарате (пропеллеры сняты) и убедись, что контроллер видит failsafe и переходит в заданный режим.
↑ К оглавлению6. Для программиста
💻 Для программиста
Парсинг SBUS — задача на побитовые операции: читаешь 25 байт, проверяешь маркеры 0x0F и 0x00, затем извлекаешь 16 значений по 11 бит из непрерывного потока.
def parse_sbus(frame):
# frame — 25 байт; маркеры уже проверены
bits = int.from_bytes(frame[1:23], 'little') # 176 бит
ch = [(bits >> (11 * i)) & 0x7FF for i in range(16)]
us = [988 + v * (2012 - 988) / 2047 for v in ch] # в микросекунды
flags = frame[23]
return us, {'ch17': flags & 1, 'ch18': flags & 2,
'lost_frame': bool(flags & 4), 'failsafe': bool(flags & 8)}
Не забывай про инверсию: если читаешь SBUS напрямую с приёмника через USB-UART адаптер, потребуется аппаратный инвертор или программная инверсия уровня на входе.
7. Чек-лист самопроверки
Урок освоен, если каждый пункт выполнен на практике:
- Расшифровал кадр SBUS логическим анализатором
- Называю параметры SBUS и IBUS по памяти
- Пересчитал 11-битное значение канала в микросекунды
- Объясняю, чем полезны флаги lost frame и failsafe
- Знаю, сколько каналов передаёт каждый протокол
8. Что дальше
- Предыдущий урок: Урок 12. DShot и прошивки ESC
- Следующий урок: Урок 14. SBUS и IBUS: монтаж, инверсия и диагностика
- Полный перечень тем — в статье «Содержание курса».

