Arduino-SBUS协议构建.上

2021-12-08 20:01:33 浏览数 (3)

我在前些日子买了个遥控器,下面是关于遥控器的文章:

Tiny X8M遥控器全解

Tiny X8M遥控器源码解读.1

我就在想,我是不是能做个解码SBUS的东西,可以方便的解码来着接收机的RC信号,毕竟遥控是每个男孩子都喜欢的东西。 FlySky A8S(SBUS接收机) ESP8266控制大疆Tello无人机.准备

自制S-Bus接收器(控制dji EP车)

自制SBUS接收端代码分析.上

关于SBUS写过几篇文章,但是一直没有很深刻的认识一下这个协议。先搜索一下相关的内容再写也不迟。

S-BUS其实是一种串口通信协议,采用100000的波特率,数据位点8bits,停止位点2bits,偶效验,即8E2的串口通信。可以传输16个比例通道和2个数字(bool)通道。其硬件上基于RS232协议,采用TTL电平,但高位取反(负逻辑,低电平为“1”,高电平为“0”)采用的是反向电平传输,也就是说,在S-BUS的发送端高低电平是反向的,协议中的所有高电平都被转换成低电平,协议中的所有低电平都被转换成高电平。通信波特率为100K(不兼容波特率115200)。

这点是我们要注意的的事情,还有一点是关于电平反向问题。

通信接口:USART(TTL)

通信参数:1个起始位 8个数据位 偶校验位 2个停止位,波特率=100000bit/s,电平逻辑反转。

通信速率:每14ms(模拟模式)或7ms(高速模式)发送,即数据帧间隔为 11ms(模拟模式)或4ms(高速模式)。

数据帧格式:[1]

代码语言:javascript复制
字节位 byte1 byte2-23 byte24 byte25

类型 开始字节 通道数据字节(含16个脉宽通道) 标志位字节(含2个数字通道) 结束字节

数据 0x0F 通道数据范围11Bits = [0,2047] 2个数字通道位 2个状态位 0x00

byte1:

代码语言:javascript复制
startbyte = 0000 1111b (0x0F)

byte2-23:

代码语言:javascript复制
databytes = 22bytes = 22 x 8Bits = 16 x 11Bits(CH1-16)

通道数据低位在前,高位在后,每个数据取11位,具体协议如下:

读取的databyte值:

byte 2 3 4 5 6 7 etc

代码语言:javascript复制
内容 12345678 12345678 12345678 12345678 12345678 12345678 etc

转化后的通道值:

通道 CH01 CH02 CH03 CH04 etc

代码语言:javascript复制
内容 67812345678 34567812345 81234567812 56781234567 etc

byte24:

代码语言:javascript复制
Bit 7 6 5 4 3 2 1 0

含义 数字通道CH17 数字通道CH18 帧丢失位 故障保护激活位 N/A N/A N/A N/A

byte25:

代码语言:javascript复制
endbyte = 0000 0000b (0x00)

大概看了这么多,就懂了,开始写。

0 人点赞