我在前些日子买了个遥控器,下面是关于遥控器的文章:
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)
大概看了这么多,就懂了,开始写。