协议概述
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个字节
取反电路说明:![](https://img-blog.csdnimg.cn/direct/6924fef1102845e689376cee147e2da9.png)
解析代码:
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;
}
}