SBUS 数据 解析处理

协议概述

        S-BUS是Futaba公司提出的舵机控制总线,支持16个比例+2个布尔共18个通道 。硬件上,它基于RS232协议,但高位取反(低电平表示1;高电平表示0)。S-BUS的协议由25个字节构成,更新率为14ms(模拟)或7ms(高速模式),波特率100kbps。每个字节11位,定义如下:
One Byte = 1 startbit + 8 databit + 1 paritybit + 2 stopbit (8E2)。
而每个包25字节如下:
[startbyte] [data1] [data2] .... [data22] [flags][endbyte]
其中,startbyte = 11110000b (0xF0);
data 1-22 放入16个通道 [ch1, 11bit][ch2, 11bit] .... [ch16, 11bit] ,每个通道取值范围:(ch# = 0 bis 2047)。拼接如下:
channel 1 uses 8 bits from data1 and 3 bits from data2
channel 2 uses last 5 bits from data2 and 6 bits from data3  
flags是信号位

PS:不必过多介绍,网上很多。

串口配置:8位数据位,2位停止位,偶校验(EVEN),无控流,25个字节

取反电路说明:

解析代码:

typedef struct
{
    uint8_t  loop_buffer[25];
    uint8_t  flags;//
    int16_t  ch[16]; //16个比例通道
    uint8_t  status;
}sFutaba;
#define setbit(x,y) x|=(1<<y)
void FutabaDataDecode(sFutaba *msg, uint8_t *pbuf, int len)
{
    //Futaba 的sbus数据通道解析

    uint8_t *pb = pbuf;
    uint8_t da;
    int pt = 0;
    if (len != 25 || pbuf == NULL || msg == NULL) return;
    for (int i = 0; i<25; i++) msg->loop_buffer[i] = pbuf[i];
    if (pbuf[0] != 0x0F) { msg->status = 1; return; } //0xF0
    msg->flags = pbuf[23];
    msg->status = 0;
    for (int i = 0; i<16; i++)
    {
        uint16_t ch_d = 0;
        for (int j = 0; j<11; j++)
        {
            pt = i * 11 + j;
            if (pt % 8 == 0)  {pb++;da = *pb;}
            if (((da >> (pt%8)) & 0x01) == 1) setbit(ch_d, j);
        }
        msg->ch[i] = (ch_d & 0x7FF) - 1002;
    }
}
 

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值