遥控器协议解析---SBUS篇

本文详细解析了SBUS串口通信协议,包括信号格式、100k波特率配置、数据传输过程和硬件反相器电路设计。还介绍了使用CubeIDE编程实现SBUS数据接收和连接状态判断的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遥控器协议解析—SBUS篇

1、SBUS信号解析

SBUS全称serial-bus,是一种串口通信协议,仅用一根信号线就能传输多达16通道的数据,比多路PWM捕获高效且省资源。


1.通信接口
USART(串口TTL)
2.串口配置
100k波特率(100 000 bits/s),8位数据位,2位停止位,偶校验(EVEN),无控流,25个字节。
(注:如果用单片机进行配置需把数据位配置成9位,否则读取无法解码)
3.协议格式
数据共25个字节
开始字节:startbyte=0x0f
通道数据字节:[data1][data2]…[data22]
data1~22: LSB(低位在前),对应16个通道(ch1-ch16),每个通道11bit(22 × 8=16 × 11);
标志位字节:[flags]
flag位标志遥控器的通讯状态,可以通过查询flag位来采取失控保护(例如乐迪R9Ds的flag位为0x00时标志存在连接)。
结束字节:endbyte=0x00

2、SBUS硬件反相器电路设计

接收机接在板子上必须加入硬件反相器,因为SBUS的信号是采用的负逻辑,也就是电平相反,只能在硬件上进行反相,在软件上无法操作。

硬件反相器设计如下:
在这里插入图片描述

3、程序实现

cubeide配置:数据位一定要设置为9位
在这里插入图片描述

需要注意的是HAL库串口中断一次后需要再开启中断才能进行下次中断

#define SBUS_DATA_SIZE      25      // 25字节

struct SBUS_t{
    uint16_t ch[16];                // 16个字节数据
};

uint8_t sbus_rx_sta = 0;                // sbus 接收状态,0:未完成,1:已完成一帧接收
uint8_t sbus_rx_buf[SBUS_DATA_SIZE];    // 接收sbus数据缓冲区
uint8_t connect_flag = flase;			// 连接是否正常
struct SBUS_t sbus;                     // SBUS 结构体实例化

void SBUS_IT_Open(void)
{
	HAL_UARTEx_ReceiveToIdle_IT(&huart4, (uint8_t *)sbus_rx_buf, SBUS_DATA_SIZE);
}

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart->Instance == USART6){
		if ((sbus_rx_buf[0] == 0x0F)&&sbus_rx_buf[24]==0x00)
		{
			sbus_rx_sta = 1;
		}
		else
		{
			sbus_rx_sta=0;
		}

		if(sbus_rx_sta==1)
        {
            sbus.ch[0] =((sbus_rx_buf[2]<<8)   + (sbus_rx_buf[1])) & 0x07ff;
            sbus.ch[1] =((sbus_rx_buf[3]<<5)   + (sbus_rx_buf[2]>>3)) & 0x07ff;
            sbus.ch[2] =((sbus_rx_buf[5]<<10)  + (sbus_rx_buf[4]<<2) + (sbus_rx_buf[3]>>6)) & 0x07ff;
            sbus.ch[3] =((sbus_rx_buf[6]<<7)   + (sbus_rx_buf[5]>>1)) & 0x07ff;
            sbus.ch[4] =((sbus_rx_buf[7]<<4)   + (sbus_rx_buf[6]>>4)) & 0x07ff;
            sbus.ch[5] =((sbus_rx_buf[9]<<9)   + (sbus_rx_buf[8]<<1) + (sbus_rx_buf[7]>>7)) & 0x07ff;
            sbus.ch[6] =((sbus_rx_buf[10]<<6)  + (sbus_rx_buf[9]>>2)) & 0x07ff;
            sbus.ch[7] =((sbus_rx_buf[11]<<3)  + (sbus_rx_buf[10]>>5)) & 0x07ff;
            sbus.ch[8] =((sbus_rx_buf[13]<<8)  + (sbus_rx_buf[12])) & 0x07ff;
            sbus.ch[9] =((sbus_rx_buf[14]<<5)  + (sbus_rx_buf[13]>>3)) & 0x07ff;
            sbus.ch[10]=((sbus_rx_buf[16]<<10) + (sbus_rx_buf[15]<<2) + (sbus_rx_buf[14]>>6)) & 0x07ff;
            sbus.ch[11]=((sbus_rx_buf[17]<<7)  + (sbus_rx_buf[16]>>1)) & 0x07ff;
            sbus.ch[12]=((sbus_rx_buf[18]<<4)  + (sbus_rx_buf[17]>>4)) & 0x07ff;
            sbus.ch[13]=((sbus_rx_buf[20]<<9)  + (sbus_rx_buf[19]<<1) + (sbus_rx_buf[18]>>7)) & 0x07ff;
            sbus.ch[14]=((sbus_rx_buf[21]<<6)  + (sbus_rx_buf[20]>>2)) & 0x07ff;
            sbus.ch[15]=((sbus_rx_buf[22]<<3)  + (sbus_rx_buf[21]>>5)) & 0x07ff;
            
			if(sbus_rx_buf[21] != 0x00)connect_flag = flase;
			else connect_flag = ture;
			
            sbus_rx_sta = 0;                        // 准备下一次接收
        }
        SBUS_IT_Open();
	}
}
03-15
### SBus 协议及其与 IT 领域的相关性 SBus 是一种通信协议,最初由 Futaba 开发并广泛应用于无线电控制设备中。它是一种串行总线协议,用于传输多路模拟输入信号到微控制器或其他电子设备上[^1]。在 IT 和嵌入式系统领域,SBus 的实现通常涉及硬件接口设计和软件解析逻辑。 #### 数据帧结构分析 SBus 使用了一种特定的数据帧格式来进行数据传输。例如,在给定的例子中: ```plaintext 1011 0100 0001 1010 & 0000 0111 1111 1111 = 0000 0100 0001 1010 ``` 上述操作展示了如何通过按位与运算提取有效数据部分。这种技术常被用来过滤掉无关的状态标志位或保留字段,从而专注于实际的有效载荷数据。 #### 转换为脉冲宽度值 当接收到完整的 SBUS 数据包后(通常是 25 字节),可以通过解码这些字节获得各个通道的具体数值。对于某些应用而言,还需要进一步将这些原始二进制数映射至对应的物理量范围——比如伺服电机的角度或者 ESC 控制器的速度百分比[^2]。 以下是 Python 中的一个简单示例程序片段,展示如何读取来自 UART 接口的 SBUS 流并将之转化为人类可读的形式: ```python import serial def parse_sbus(data): channels = [] # Extract channel values from the raw data buffer. for i in range(1, 23): ch_val = (data[i] | ((data[i + 1] & 0x0F) << 8)) * 100 / 9765 channels.append(ch_val) return channels ser = serial.Serial('/dev/ttyUSB0', baudrate=100000) while True: sbus_data = ser.read(25) # Read exactly one frame of SBUS data parsed_channels = parse_sbus(sbus_data) print(parsed_channels[:16]) # Print first sixteen channels' PWM duty cycle (%). ``` 此脚本利用 PySerial 库连接到指定端口号上的虚拟 COM 设备,并持续监听传入的消息流;每当捕获满一帧时即调用 `parse_sbus` 函数完成初步处理工作。 #### 关联概念探讨 尽管 SBus 主要服务于无人机飞控等领域,但它背后所依赖的一些基础原理同样适用于更广泛的计算机科学范畴之内: - **异步串行通讯**:类似于 RS-232 或者 USB-CDC 类型的标准。 - **错误检测机制**:采用奇偶校验等方式增强可靠性。 - **高效编码方式**:尽可能减少冗余开销的同时保持足够的精度。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值