SBUS协议解析和实战踩坑注意事项
S.BUS是FUTABA提出的舵机控制总线,全称Serial Bus,别名S-BUS或SBUS,也称 Futaba S.BUS。是一种由日本Futaba公司开发的串行通信协议,主要用于遥控模型(如无人机、航模)和飞行控制系统中,通过单根信号线传输多通道控制数据。S.BUS可以传输16个比例通道和2个数字(bool)通道。其硬件上基于RS232协议,采用TTL电平,但高位取反(负逻辑,低电平为“1”
SBUS协议简介
S.BUS是FUTABA提出的舵机控制总线,全称Serial Bus,别名S-BUS或SBUS,也称 Futaba S.BUS。是一种由日本Futaba公司开发的串行通信协议,主要用于遥控模型(如无人机、航模)和飞行控制系统中,通过单根信号线传输多通道控制数据。
S.BUS可以传输16个比例通道和2个数字(bool)通道。其硬件上基于RS232协议,采用TTL电平,但高位取反(负逻辑,低电平为“1”,高电平为“0”),通信波特率为100K(不兼容波特率115200)。
协议详解析
通信接口:USART(TTL)
通信参数:1个起始位+8个数据位+偶校验位+2个停止位,波特率=100000bit/s,电平逻辑反转。
通信速率:每4ms发送一帧(高速模式),每14ms发送一帧(低速模式)
数据帧格式:完整的一个SBUS数据帧有25Byte
Byte1:帧头,0x0F
Byte2-23:16通道的值,总占用22Byte,一个通道值占用11Bit(16×11=8×22=176)
Byte24:标志位(此字节每个接收机厂家制作略有不同,思翼遥控错误时为0x0C,JumperT20正确时为0x04,使用时需注意)
Bit7:CH17数字通道
Bit6:CH16数字通道
Bit5:帧丢失(Frame lost)
Bit4:安全保护(Failsafe):失控保护激活位(0x10)判断飞机是否失控
Bit3~Bit0:低四位不用
Byte25:帧尾,0x00
硬件实现要点
接收端设计:
需使用支持反向电平的USART,或外接反相电路(如NPN三极管)。目前我使用过STM32和NXP_RT1052芯片的USART成功接收,我使用的接收机使用的是ESP8285芯片,信号线需接一个上拉电阻,否则会导致上电接收机不能正常工作
程序设计(自己写的程序参考思路)
接收数据
/******************串口接收中断服务函数********************/
void DEBUG_UART2_IRQHandler(void)
{
/*串口接收到数据*/
if ((kLPUART_RxDataRegFullFlag)&LPUART_GetStatusFlags(DEBUG_UART2))
{
/*读取数据*/
Usart2_Data = LPUART_ReadByte(DEBUG_UART2);
//定义了一个比较长的数组接收串口数据,方便在线调试查看接收的数据帧格式对不对
if(PacketCNT<513-32)
{
PacketData[PacketCNT]=Usart2_Data;
PacketCNT++;
}
switch(JumperT20_RecvFlag)
{
case 0:
if(Usart2_Data==0x0F&&Usart2_Data_Last==0) //溢出判断
{
SBUS_Num=0;
SBUS_Data[SBUS_Num]=Usart2_Data; //of e0 c0
JumperT20_RecvFlag=1;
}
break;
case 1:
if(SBUS_Num<=23)
{
SBUS_Num++;
SBUS_Data[SBUS_Num]=Usart2_Data;
if(SBUS_Num==24)//正确接收一帧
{
if(SBUS_Data[23]==0&&Usart2_Data==0x00)//接收正常正确一帧
{
JumperT20_RecvFlag=0;
SBUS_RecvFlag=1;
}
else if(SBUS_Data[23]==0x0C&&Usart2_Data==0x00)//接收正常错误一帧
{
JumperT20_RecvFlag=0;
SBUS_RecvFlag=1;
}
else
{
JumperT20_RecvFlag=0;
SBUS_RecvFlag=0;//接收不正常错误一帧
}
}
}
break;
}
Usart2_Data_Last=Usart2_Data;
}
}
解析数据
if(SBUS_RecvFlag==1)//代表接收完成进进入解析阶段
{
SBUS_RecvFlag=0;
Timeout=0;
//if(SBUS_Data[23] == 0 && SBUS_Data[0] == 0x0F&&UsartRX5_flag==1)//接收,UsartRX5_flag进入中断标志位
if(SBUS_Data[23] == 0 && SBUS_Data[0] == 0x0F)//接收
{
JumperT20.Channel[0] = (((int16_t)(SBUS_Data[1] >> 0 | SBUS_Data[2] << 8)) & 0x07ff) +8- 1000; //-800~800
JumperT20.Channel[1] = ((SBUS_Data[2] >> 3 | SBUS_Data[3] << 5) & 0x07ff) +8- 1000; //线速度
JumperT20.Channel[2] = ((SBUS_Data[3] >> 6 | SBUS_Data[4] << 2 | SBUS_Data[5] << 10) & 0x07ff) +8- 1000; //192 992 1792
JumperT20.Channel[3] = ((SBUS_Data[5] >> 1 | SBUS_Data[6] << 7) & 0x07ff) +8- 1000;//角速度
JumperT20.Channel[4] = ((SBUS_Data[6] >> 4 | SBUS_Data[7] << 4) & 0x07ff);
JumperT20.Channel[5] = ((SBUS_Data[7] >> 7 | SBUS_Data[8] << 1 | SBUS_Data[9] << 9) & 0x07ff) ;
JumperT20.Channel[6] = ((SBUS_Data[9] >> 2 | SBUS_Data[10] << 6 )&0x07ff);
JumperT20.Channel[7] = (SBUS_Data[10] >>5 | SBUS_Data[11] << 3 )& 0x07ff;
JumperT20.Channel[8] = ((SBUS_Data[12] >>0 | SBUS_Data[13] << 8 )& 0x07ff);
JumperT20.Channel[9] = (SBUS_Data[13] >> 3 | SBUS_Data[14] << 5 )& 0x07ff;
JumperT20.Channel[10] = ( SBUS_Data[14] >> 6 | SBUS_Data[15] << 2 | SBUS_Data[16] << 10 )& 0x07ff;
JumperT20.Channel[11] = ((SBUS_Data[16] >> 1 | SBUS_Data[17] << 7 )& 0x07ff) ;
JumperT20.Channel[12] = (( SBUS_Data[17] >> 4 | SBUS_Data[18] << 4 )& 0x07ff);
JumperT20.Channel[13] = ((SBUS_Data[18] >> 7 | SBUS_Data[19] << 1 | SBUS_Data[20] << 9 )& 0x7ff) ;
JumperT20.Channel[14] = (SBUS_Data[20] >> 2 | SBUS_Data[21] << 6 )& 0x7ff;
JumperT20.Channel[15] = (SBUS_Data[21] >>5 | SBUS_Data[22] << 3 )& 0x7ff;
SBUS_RecvFlag=2; //代表解析完毕
}
else if(SBUS_RecvFlag==0)//断联和接收错误1s进入急停
{
Timeout++;
if(Timeout>100)
Timeout=100;
}
}
注意事项
1.我使用的Jumper T20S遥控,在遥控上需要配置成为SBUS模式,接收机才能正常输出SBUS协议数据帧。
2.使用之前先接收机和遥控对频,否则不会输出数据。
3.必须硬件电路反向,软件实现不了起始位和停止位反向
更多推荐



所有评论(0)