Перейти к содержимому
SBUS и IBUS: кадры и параметры

SBUS и IBUS: кадры и параметры

02 сентября 2026
Пилоту БПЛА | Технику БПЛА | Хобби

Протоколы в БАС: полный курс · Урок 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: параметры и кадр

ПараметрSBUSIBUSCRSF (для сравнения)
Физика 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 байт — старт 0x0F, 22 байта данных, флаги, конец 0x00

Кадр SBUS — 25 байт каждые 7–14 мс: стартовый байт 0x0F, 22 байта данных (16 каналов по 11 бит), байт флагов, конечный байт 0x00.

 sbus_frame_2a79a.png

 sbus_frame2_0908e.png

Plain text

Разбор кадра по байтам:

  • Байт 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)}
Python

Не забывай про инверсию: если читаешь SBUS напрямую с приёмника через USB-UART адаптер, потребуется аппаратный инвертор или программная инверсия уровня на входе.

↑ К оглавлению

7. Чек-лист самопроверки

Урок освоен, если каждый пункт выполнен на практике:

  • Расшифровал кадр SBUS логическим анализатором
  • Называю параметры SBUS и IBUS по памяти
  • Пересчитал 11-битное значение канала в микросекунды
  • Объясняю, чем полезны флаги lost frame и failsafe
  • Знаю, сколько каналов передаёт каждый протокол
Результат: все пункты выполнены — переходите к следующему уроку.
↑ К оглавлению

8. Что дальше

  • Предыдущий урок: Урок 12. DShot и прошивки ESC
  • Следующий урок: Урок 14. SBUS и IBUS: монтаж, инверсия и диагностика
  • Полный перечень тем — в статье «Содержание курса».
↑ К оглавлению
SBUS и IBUS: кадры и параметры
24