当前位置:文档之家› 航模遥控器S-BUS协议说明及解析

航模遥控器S-BUS协议说明及解析

航模遥控S-BUS协议解析
——写代码的Tobem
S-BUS的帧格式为每帧25个字节,除去起始字节(startbyte)、结束字节(endbyte)和校验标志(flags)后,中间的22个字节就是16个通道的数据了。

每个通道用11bit表示,范围是0-2047。

其中,data1为ch1的低8位,data2的低3位为ch1的高三位,data2的高5位是ch2的低5位,data3的低6位是ch2的高6位,以此类推。

实际中,只用到8个通道,因此,程序中只解析前面的8个通道。

因此,当接收到遥控数据并判断有效后(校验标志flags为0x00,即SBus_Buffer[22]==0X00),先把每一通道的值通过位的方式进行提取:
for(i=0;i<88;i++) //8个通道:8*11=88
{
if(Buff[Byte_in_Sbus]&(1<<Bit_in_SBus))
{
Channels[Channel_Count]|=1<<Bit_in_Channel; //按位方式进行通道数据提取}
Bit_in_SBus++;
Bit_in_Channel++;
if(Bit_in_SBus==8) //每取完8位,则字节数加1
{
Bit_in_SBus=0;
Byte_in_Sbus++;
}
if(Bit_in_Channel==11) //每取完11位,则通道数加1
{
Bit_in_Channel=0;
Channel_Count++;
}
}
其中,通道0对应横滚控制,通道1对应俯仰控制,通道2对应油门控制,通道3对应方向控制:
channel_roll.radio_in=Channels[0]; //横滚
channel_pitch.radio_in=Channels[1];//俯仰
channel_throttle.radio_in=Channels[2];//油门
channel_rudder.radio_in=Channels[3];//方向
通道4和通道5用于飞行模式的切换,由于其采用指拨开关,因此通过前后两次通道值的变化以及当前通道值所处区间来判断模式的改变:
if(fabs(Channels[4]-last_channel_4)>300) //条件成立,说明前后两次开关有改变
{
last_channel_4 = Channels[4]; //记录上一次的值
if(Channels[4]<400) //4通道用于控制模式切换:下;自动
{
control_mode = MANUAL;
}
else if(Channels[4]<1100) //中;增稳模式
{
control_mode = STABILIZE;
}
else if(Channels[4]<1750) //上;手动
{
control_mode =AUTO;
}
}
if(fabs(Channels[5]-last_channel_5)>300) //条件成立,说明前后两次开关有改变
{
last_channel_5 = Channels[5];
if(Channels[5]<400) //5通道用于飞行模式切换:下;返航
{
flight_mode = Loiter ;
}
else if(Channels[5]<1100) //中;航线
{
flight_mode = Navigation_Line;
}
else if(Channels[5]<1750) //上;盘旋
{
flight_mode = Rtl;
}
}
假如遥控器连接不正常(校验标志flags为0x0C,即SBus_Buffer[22]==0X0C),则按遥控归中处理:
if(SBus_Buffer[22]==0X0C) //遥控器连接不正常
{
channel_roll.radio_in=1024;
channel_pitch.radio_in=1024;
channel_throttle.radio_in=343;
channel_rudder.radio_in=1024;
}。

相关主题