Futaba S-BUS协议解析

一、协议说明

  1. S-BUS协议实际上通过串口进行数据发送。但是需要注意的是,S-BUS的逻辑电平是反的,需用如下电路对电平反相,再接到串口接收的管脚。三极管可以用8050。
    SUBS反相器

  2. 串口配置为波特率100kbps( 100000 ),8位数据,偶校验(even),2位停止位,无流控。

  3. 每帧25个字节,帧格式如下【参考https://mbed.org/users/Digixx/notebook/futaba-s-bus-controlled-by-mbed/】:
    [Start Byte] [Data0] [Data1] …. [Data21] [Flags][End Byte]
    两帧之间的时间间隔4ms(高速模式),约7ms一帧。
    其中:
    Start Byte = 0x0F。中间22个字节为16个通道的数据,每个通道用 11 bit表示,范围是0-2047。
    End Byte根据S-BUS协议版本不同而不同。
    Flags的定义:
    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
    数据部分:
    如果把22个字节看作一个数的话,则数据部分采用小端模式。即若把数据按照[Data21][Data20]…[Data1][Data0]的顺序排列,则[Data21]的 bit 7 为MSB,[Data0]的 bit 0 为LSB,每 11 bit 为一个通道的数据。Data[21]和[Data20]的高3位为通道16的值,以此类推。
    借用一张图,改了改:
    各通道数据的排列方式
    下面是一组数据的例子(来自 R7008SB):
    0F 01 04 20 A8 01 08 16 50 83 1A 80 00 04 20 00 01 08 07 38 00 10 80 00 04
    0F 01 04 20 A8 01 08 16 50 83 1A 80 00 04 20 00 01 08 07 38 00 10 80 00 14
    0F 01 04 20 A8 01 08 16 50 83 1A 80 00 04 20 00 01 08 07 38 00 10 80 00 24
    0F 01 04 20 A8 01 08 16 50 83 1A 80 00 04 20 00 01 08 07 38 00 10 80 00 34
    0F 01 04 20 A8 01 08 16 50 83 1A 80 00 04 20 00 01 08 07 38 00 10 80 00 04
    0F 01 04 20 A8 01 08 16 50 83 1A 80 00 04 20 00 01 08 07 38 00 10 80 00 14
    0F 01 04 20 A8 01 08 16 50 83 1A 80 00 04 20 00 01 08 07 38 00 10 80 00 24
    0F 01 04 20 A8 01 08 16 50 83 1A 80 00 04 20 00 01 08 07 38 00 10 80 00 34

二、S-BUS解析程序

void Process(uint8_t* raw,uint16_t* result)
{
  uint8_t bitsToRead=3; // bitsToRead表示需要从下一个字节中读取多少bit。规律:bitsToRead 每次总是增加 3
  uint8_t bitsToShift;
  uint8_t startByte=21;
  uint8_t channelId=15;

  do
  {
    result[channelId]=raw[startByte];

    if(bitsToRead<=8)
    {
      result[channelId]<<=bitsToRead;
      bitsToShift=8-bitsToRead;
      result[channelId]+=(raw[startByte-1]>>bitsToShift);
    }
    else
    {
      result[channelId]<<=8;
      result[channelId]+=raw[startByte-1];
      startByte--;
      bitsToRead-=8;
      result[channelId]<<=bitsToRead;
      bitsToShift=8-bitsToRead;
      result[channelId]+=(raw[startByte-1]>>bitsToShift);
    }

    result[channelId]&=0x7FF;

    channelId--;
    startByte--;
    bitsToRead+=3;

  }while(startByte>0);  
}

感谢来自
taogashi【http://www.eefocus.com/taogashi/blog/14-05/303577_f140d.html
以及
Uwe Gartmann【https://developer.mbed.org/users/Digixx/notebook/futaba-s-bus-controlled-by-mbed/
的有关S-BUS协议的介绍。

  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
SBUS是一种串行总线通信协议,用于无人机和遥控器之间的数字信号传输。SBUSFutaba公司开发的一种数字通信协议,可以通过单根信号线传输16个通道的数据,同时还可以传输其他的控制信息。 STM32是一种单片机,可以通过编程实现对SBUS信号的解析。以下是STM32解析SBUS的步骤: 1. 配置串口 首先需要选择一个可用的串口,并将其配置为接收模式。在STM32中,可以使用USART或UART模块实现串口通信。需要设置串口的波特率、数据位数、停止位数和校验位等参数。 2. 接收数据 配置好串口后,可以通过读取串口接收缓冲区中的数据来接收SBUS信号。SBUS信号以帧的形式传输,每一帧的长度为25个字节。读取串口缓冲区中的数据,并判断接收到的数据是否为完整的一帧,如果是,则进行下一步处理。 3. 解析数据 接收到完整的一帧数据后,需要对其中的数据进行解析。SBUS信号的第一字节为0x0F,用于标识这是一帧SBUS数据。接下来的16个字节分别对应16个通道的数据,每个通道的数据占用11位,最高位为标识位。还有两个字节分别用于标识数字信号的状态和传输错误的计数。 4. 处理数据 解析出每个通道的数据后,可以根据需要进行相应的处理,比如将数据转换为实际控制量,或者存储到数组中以备后续使用。 5. 发送数据 如果需要将处理后的数据发送到其他设备,则需要将数据通过串口发送出去。发送数据的方法与接收数据的方法类似,只是需要将数据写入串口发送缓冲区中。 以上就是STM32解析SBUS信号的基本步骤,需要对串口通信和数据解析有一定的了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值