Skip to content

第 4 章:SBUS 遥控接收

4.1 知识要点

  • SBUS 协议帧格式:25 字节,100000 baud,8E2,信号反相
  • 16 通道 11-bit 数据的位域解包算法
  • ESP-IDF UART 驱动配置与信号反相
  • Failsafe 与 Lost Frame 标志位的处理

4.2 课程内容

SBUS 是 Futaba 开发的数字遥控协议,广泛用于航模和机器人领域。它通过单根串行线传输 16 个模拟通道和 2 个数字通道的数据,每帧 25 字节,以 14 ms(高速模式)或 7 ms 间隔发送。OSRCORE 使用 UART0 的 GPIO44 接收 SBUS 信号,硬件反相器将 SBUS 的反相逻辑还原为标准 UART 电平。

4.3 基础学习

SBUS 帧格式

字节 0:0x0F(帧头)
字节 1-22:22 字节数据(16 通道 × 11 bit = 176 bit)
字节 23:标志字节
  bit2 = failsafe(接收机失联保护激活)
  bit3 = lost_frame(帧丢失)
字节 24:0x00(帧尾)

通道值范围:240(最小)~ 1810(最大),中立约 1024。

位域解包

16 个通道的 11-bit 数据紧密打包在 22 字节中,需要按位提取:

c
ch[0] = ((buf[1]      | buf[2]  << 8) & 0x07FF);
ch[1] = ((buf[2] >> 3 | buf[3]  << 5) & 0x07FF);
ch[2] = ((buf[3] >> 6 | buf[4]  << 2 | buf[5] << 10) & 0x07FF);
// ... 以此类推

UART 配置要点

SBUS 使用非标准参数:100000 baud(非 115200)、偶校验(8E2)、信号反相。ESP-IDF 通过 uart_set_line_inverse() 在硬件层面处理反相,无需外部电路。

4.4 程序学习

UART 初始化(含反相):

c
uart_config_t cfg = {
    .baud_rate  = 100000,
    .data_bits  = UART_DATA_8_BITS,
    .parity     = UART_PARITY_EVEN,
    .stop_bits  = UART_STOP_BITS_2,
    .flow_ctrl  = UART_HW_FLOWCTRL_DISABLE,
    .source_clk = UART_SCLK_DEFAULT,
};
uart_driver_install(UART_NUM_0, 256, 0, 0, NULL, 0);
uart_param_config(UART_NUM_0, &cfg);
uart_set_pin(UART_NUM_0, 43, 44, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
uart_set_line_inverse(UART_NUM_0, UART_SIGNAL_RXD_INV | UART_SIGNAL_TXD_INV);

帧同步与解析:

c
// 同步到帧头 0x0F
uint8_t byte;
do {
    uart_read_bytes(UART_NUM_0, &byte, 1, portMAX_DELAY);
} while (byte != 0x0F);

buf[0] = byte;
int got = uart_read_bytes(UART_NUM_0, buf + 1, 24, pdMS_TO_TICKS(10));
if (got == 24 && sbus_parse(buf, &data)) {
    if (!data.failsafe) {
        // 处理通道数据
    }
}

SBUS 通道值转换为 PWM 脉宽(µs):

c
// SBUS 范围 240-1810 → PWM 1000-2000 µs
#define SBUS_TO_US(v) ((uint32_t)(((v) - 240) * 1000 / 1570 + 1000))

4.5 课程总结

本章掌握了 SBUS 协议的帧格式和位域解包算法,学会了配置 ESP-IDF UART 驱动处理非标准波特率和信号反相。SBUS 接收是机器人遥控操作的基础,第 11 章将把它集成到完整控制系统中。


Built for OSRCORE robot development board.