SBUS协议解析图解

SBUS协议在硬件层面是串口反相协议,但在软件上表现为常规串口协议,配置为100k波特率,8位数据位(STM32中因校验位设为9位)。协议包含16个11比特通道的数据,存储在uint8[22]数组中。每个通道值的11比特按照串口发送的低位优先(LSB)顺序分布,例如通道2的值跨越3个字节,通过位提取和移位操作重组。文章提供了一种清晰的解析方法,包括使用结构体数组批量解析所有通道值。

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

SBUS协议在硬件上是串口反相协议。

在软件上就是普通串口协议,波特率100k,8位数据位,2位停止位,偶校验even。注意,stm32把校验位也当做数据,所以数据位要设置成9,而不是8。

其报文格式为:

字段内容
定值0x0F
通道值uint8[22]
标志位uint8
uint8

SBUS协议总共可以携带16个通道的数据,每个通道的数据为11比特,那么16个通道共有16*11=176个比特。这176个比特,就存储在上述表格uint8[22]这个数组中。你会发现这个数组恰好能容纳22*8=176个比特。

下面的问题就是,每个通道的值是如何在这个数组中排布的。

基础知识,串口字节协议是低位(LSB)先发,例如某个字节值为0x8F(也即1000 1111),那么接收端按照先后顺序,依次收到的比特为:1 1 1 1 0 0 0 1。

刚开始感觉SBUS协议的通道值的拼凑规则非常奇葩,后来才理解到,它是完全按照串口硬件发送比特的顺序,来拼凑通道值的。先发送的11个bit就是通道0的值,接下来的11bit就是通道1的值,再接下来的11bit就是通道2的值。。。以此类推。而且通道值的拼凑也是按照串口的硬件规则来的,也即先收到的bit是最低位。

网上找了很多SBUS的图解,都做的不好,下面是我自己画的一个图,绝对清晰明了。

本文由【暴躁的野生猿】发表于CSDN,如有非法转载,请帮忙举报谢谢。

百度搜索:【暴躁的野生猿 CSDN SBUS协议解析图解】 可以找到原文。

下面表格第一行是串口通道值数组byte0~byte21共22字节,第二行是解析后通道值ch0~ch15共16个通道。

通道2的值横跨3个字节,我们以它为例:

uint16_t high = byte[4] & 0x01;//提取通道2的高1比特
uint16_t mid = byte[3] & 0xFF;//提取通道2的中间8比特
uint16_t low = (byte[2] >> 6) & 0x03;//提取通道2的低2比特
ch[2] =  (low) | (mid << 2) | (high << 10);//合成得到通道2的值

如果有些通道只横跨2个字节,那么就不需要拼凑mid了,为了使程序更具通用性,可以&0x00。

更进一步,使用循环来解析16个通道,我们可以把上面程序中的出现的9个参数定义成结构体,一把就给解析出来,在ch2这个例子中,依次出现的9个参数为:
4、 0x01、 3、 0xFF、 2、 6、 0x03、 2、 10

按照这个规则,我们把16个通道的参数都写出来,存到结构体数组中,就可以一次性把16个通道值都解析出来了。

换个颜色看看:

 

### STM32 中 SBUS 协议工作原理 SBUS 是一种由 Futaba 开发的串行总线通信协议,用于无线遥控设备与接收器之间的数据传输。该协议采用单向、半双工模式,在接收机和飞行控制器间传递控制信号。 #### 数据帧结构 每帧 SBUS 数据包含 25 字节的信息,其中前 22 字节表示 16 个通道的状态值(每个通道占用 11 比特),剩余字节则用来校验以及标志位[^1]。 ```plaintext | Start Byte | Ch1-8 Data (11 bits each) | Ch9-16 Data (11 bits each) | Flags & Checksum | ``` 为了确保数据准确性,发送端会在每一帧结束处附加一个奇偶校验码来验证接收到的数据完整性。 ### 实现方法概述 当使用 STM32 处理 SBUS 流量时,通常会涉及到以下几个方面: - **UART 接口配置**:设置 UART 工作参数以匹配 SBUS 的波特率和其他特性。 - **硬件取反电路应用**:由于 SBUS 使用的是负逻辑电平标准,因此在实际连接中往往需要通过外部电路对信号进行反转处理[^3]。 - **中断服务程序编写**:每当检测到新的 SBUS 帧到达时触发相应的 ISR 来读取并解析这些信息。 - **定时器管理**:考虑到 SBUS 定义了一定的时间间隔内必须更新一次完整的状态集,所以还需要利用定时器功能监控超时情况。 具体来说,在初始化阶段应该完成如下操作: ```c // 配置 USART 初始化结构体 USART_InitTypeDef usart_init_struct; usart_init_struct.BaudRate = 100000; // 设置波特率为 100kbps usart_init_struct.WordLength = USART_WordLength_8b; usart_init_struct.StopBits = USART_StopBits_2; usart_init_struct.Parity = USART_Parity_No; usart_init_struct.Mode = USART_Mode_Rx; // 调用 HAL 库函数启动外设 HAL_UART_Init(&huart, &usart_init_struct); ``` 对于硬件取反部分,则可以参照提供的电路设计指南构建合适的接口板卡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值