SBUS总线

SBUS是一个接收机串行总线输出,通过这根总线,可以获得遥控器上所有通道的数据。目前很多模型及无人机电子设备都支持SBUS总线的接入。使用SBUS总线获取通道数据,效率高的,而且节省硬件资源,只需要一根线即可获取所有通道的数据。

扩展资料:

SBUS总线使用的是TTL电平的反向电平,即标准TTL中的1取反为0,而0则取反为1,串口波特率为100000,数据位为8位,2个停止位,偶校验。

SBUS一帧数据的长度为25个字节,其中第"0"个字节为帧头:0x0f;第24个字节为帧尾:0x00;从第1个字节到第22个字节为1-16号比例通道的数据字节;第23字节中,第7位为数字开关通道17通道,第6位为数字开关通道18通道。

第5位为帧状态标志为(判断是否丢帧),用于控制接收机上的LED的状态,第4位为失控保护激活标志位,此位为1时,表示接收机进入失控保护状态。


 SBUS总线_第1张图片


 

1、简介
SBUS本质是一种串口通信协议,采用100K的波特率,8位数据位,两位停止位,偶效验,即8E2的串口通信。

值得注意的有三点:

1.SBUS采用负逻辑,所以无论接收还是发送都要进行硬件取反(注意,一定要硬件取反),电路如下

这是我在网上看资料时看到的电路,实际上我用的是下面这个电路

2.SBUS有两种模式,

      a.高速模式:每4ms发送一次

      b.低速模式:每14ms发送一次

   就是说每间隔4或者14ms这个串口就发送25个字节的数据,这25个字节的数据最多可以包含16个信息

3.100K的波特率不是标准波特率,一般串口工具都不能直接读取(所以不要直接用电脑调试,除非你的电脑写好了非标准串口),可以用单片机读取。

 

2.具体协议的格式如下:
        [数据头] [第一个字节] [第二个字节] ......[第二十二的字节] [标志位] [数据尾]

数据头、标志位、数据尾 不携带信息,而且数据头和数据尾是固定的,数据头=0x0f; 数据尾=0x00; 

数据头(1字节)+数据(22字节)+标志位(1字节)+数据尾(1字节)

 

3.编解码C语言源码 
编码原理

       一个信息是二进制的11bit,比如1111 1111 111就可以表示一个信息,一共16个这样的信息,按照顺序将这16个信息依次排成一串,得到一个176bit(11 *16)的数据,也就是22字节(176 / 8 = 22)的数据,再加上数据头数据尾校验位就组成了一个要通过串口传送的信息。每隔4或者14ms就传送一个这样的信息。

      所以这16个信息每一个所能表示的最大值是2^11 = 2048,也就是他的精度。

      标志位

      标志位的高四位有特殊含义,第四位并没有使用,依照我的理解,第七位和第六位表示两个数字通道(通道17和18)信息(就是只有高低电平的通道,一般用来控制通断或者某个电机简单的启动或者停止,比如1表示启动电机0表示停止电机),第五位表示帧丢失,接收机红色LED亮起,我的理解是,如果这一位为1,表示这一帧信号出问题了,接收机红色LED亮起。第四位表示故障保护激活,意思应该是说如果这一位为1,激活接受方故障保护。

     bit7 = ch17 = digital channel (0x80)
     bit6 = ch18 = digital channel (0x40)
     bit5 = Frame lost, equivalent red LED on receiver (0x20)
     bit4 = failsafe activated (0x10)
     bit3 = n/a
     bit2 = n/a
     bit1 = n/a
     bit0 = n/a

  解码代码
      buffer[]对应接收到的数据

       _channels[]对应通道

_channels[0]  = ((buffer[1]|buffer[2]<<8)                      & 0x07FF);
_channels[1]  = ((buffer[2]>>3 |buffer[3]<<5)                 & 0x07FF);
_channels[2]  = ((buffer[3]>>6 |buffer[4]<<2 |buffer[5]<<10)  & 0x07FF);
_channels[3]  = ((buffer[5]>>1 |buffer[6]<<7)                 & 0x07FF);
_channels[4]  = ((buffer[6]>>4 |buffer[7]<<4)                 & 0x07FF);
_channels[5]  = ((buffer[7]>>7 |buffer[8]<<1 |buffer[9]<<9)   & 0x07FF);
_channels[6]  = ((buffer[9]>>2 |buffer[10]<<6)                & 0x07FF);
_channels[7]  = ((buffer[10]>>5|buffer[11]<<3)                & 0x07FF);
_channels[8]  = ((buffer[12]   |buffer[13]<<8)                & 0x07FF);
_channels[9]  = ((buffer[13]>>3|buffer[14]<<5)                & 0x07FF);
_channels[10] = ((buffer[14]>>6|buffer[15]<<2|buffer[16]<<10) & 0x07FF);
_channels[11] = ((buffer[16]>>1|buffer[17]<<7)                & 0x07FF);
_channels[12] = ((buffer[17]>>4|buffer[18]<<4)                & 0x07FF);
_channels[13] = ((buffer[18]>>7|buffer[19]<<1|buffer[20]<<9)  & 0x07FF);
_channels[14] = ((buffer[20]>>2|buffer[21]<<6)                & 0x07FF);
_channels[15] = ((buffer[21]>>5|buffer[22]<<3)                & 0x07FF);
  编码代码
 
    // SBUS header
    packet[0] = 0x0F; 
    // 16 channels of 11 bit data
    packet[1]  = (unsigned char) ((channels[0] & 0x07FF));
    packet[2]  = (unsigned char) ((channels[0] & 0x07FF)>>8   | (channels[1] & 0x07FF)<<3);
    packet[3]  = (unsigned char) ((channels[1] & 0x07FF)>>5   | (channels[2] & 0x07FF)<<6);
    packet[4]  = (unsigned char) ((channels[2] & 0x07FF)>>2);
    packet[5]  = (unsigned char) ((channels[2] & 0x07FF)>>10  | (channels[3] & 0x07FF)<<1);
    packet[6]  = (unsigned char) ((channels[3] & 0x07FF)>>7   | (channels[4] & 0x07FF)<<4);
    packet[7]  = (unsigned char) ((channels[4] & 0x07FF)>>4   | (channels[5] & 0x07FF)<<7);
    packet[8]  = (unsigned char) ((channels[5] & 0x07FF)>>1);
    packet[9]  = (unsigned char) ((channels[5] & 0x07FF)>>9   | (channels[6] & 0x07FF)<<2);
    packet[10] = (unsigned char) ((channels[6] & 0x07FF)>>6   | (channels[7] & 0x07FF)<<5);
    packet[11] = (unsigned char) ((channels[7] & 0x07FF)>>3);
    packet[12] = (unsigned char) ((channels[8] & 0x07FF));
    packet[13] = (unsigned char) ((channels[8] & 0x07FF)>>8   | (channels[9] & 0x07FF)<<3);
    packet[14] = (unsigned char) ((channels[9] & 0x07FF)>>5   | (channels[10] & 0x07FF)<<6);  
    packet[15] = (unsigned char) ((channels[10] & 0x07FF)>>2);
    packet[16] = (unsigned char) ((channels[10] & 0x07FF)>>10 | (channels[11] & 0x07FF)<<1);
    packet[17] = (unsigned char) ((channels[11] & 0x07FF)>>7  | (channels[12] & 0x07FF)<<4);
    packet[18] = (unsigned char) ((channels[12] & 0x07FF)>>4  | (channels[13] & 0x07FF)<<7);
    packet[19] = (unsigned char) ((channels[13] & 0x07FF)>>1);
    packet[20] = (unsigned char) ((channels[13] & 0x07FF)>>9  | (channels[14] & 0x07FF)<<2);
    packet[21] = (unsigned char) ((channels[14] & 0x07FF)>>6  | (channels[15] & 0x07FF)<<5);
    packet[22] = (unsigned char) ((channels[15] & 0x07FF)>>3);
    // flags
    packet[23] = 0x00;
    // footer
    packet[24] = 0X00;
 


 

 

 

你可能感兴趣的:(协议)