SBUS协议:SBUS解析与合成
SBUS協議:使用的是串口的通訊,直接可以用串口發出,但有幾點仍需要注意:
1.串口配置:100k波特率,8位數據位(在stm32中要選擇9位),偶校驗(EVEN),2位停止位,無控流,25個字節,
2.協議格式:(8字節)
[startbyte] [data1][data2]…[data22][flags][endbyte]
startbyte=0x0f;
endbyte=0x00;
flags標志位我沒有用到;
data1…data22:對應16個通道(ch1-ch16),每個通道11bit(228=1611=176);
數據范圍在0-2047之間,基本上是1102~1927,中值為1500;
ch1的11位=data2的低3位+data1的8位;
例如:data1=00110110,data2=11001111;
這時ch1=111 00110110=1846;通道1 的值就為1846;
ch2=data3的低6位+data2的高5位;
ch3=data5的低1位+data4的8位+data3的高2位;
ch4=4 7;
ch5=7 4;
ch6=2 8 1;
ch7=5 6;
ch8=8 3;
ch9=6 5;
ch10=1 8 2;
ch11=4 7;
ch12=7 4;
ch13=2 8 1;
ch14=5 6;
ch15=8 3;
ch16=6 5;
3.接下來要說的就是我開頭提起的取反問題;
用stm32中給px4發時,需要取反,并且是硬件取反,軟件取反是無效的(我在這個上面栽了跟頭);硬件取反的電路圖我貼上了,(這時轉自 雪域Sky的狼窩 的博客;網址http://www.360doc.com/content/16/0818/08/35267583_584012245.shtml)
4.接下來要說的是它的間隔問題:它分兩種模式(我記得是叫高速模式和普通模式)
高速模式:每隔7ms一幀數據,因為兩幀的間隔只有超過3ms,才會被接受;
而根據波特率計算一下,發送25字節需要的時間+3~4ms=7ms
普通模式:每隔14ms一幀數據;
5.數據的解析跟合并我都下載了px4的源碼,寫成.c格式,
詳細代碼,我已經上傳到我的博客下載頁上,有興趣的小伙伴,可以去下載一下;
合成函數:
void sbus_out(uint16_t num_values);//參數為通道數;
values[16]就是對應的16個通道;
解析函數:
void sbus_decode(unsigned char *frame);
//frame為25個u8位數據;
看大家有幾個問題,統一回答一下:
1.宏定義具體是多少:
#define SBUS_FRAME_SIZE 25
#define SBUS_RANGE_MIN 200.0f
#define SBUS_RANGE_MAX 1800.0f
#define SBUS_TARGET_MIN 1000.0f
#define SBUS_TARGET_MAX 2000.0f
#define SBUS_SCALE_FACTOR ((SBUS_TARGET_MAX - SBUS_TARGET_MIN)/(SBUS_RANGE_MAX-SBUS_RANGE_MIN))//0.625f
#define SBUS_SCALE_OFFSET (int)(SBUS_TARGET_MIN - (SBUS_SCALE_FACTOR * SBUS_RANGE_MIN + 0.5f)) //874.5f
2.下載頁是多少:
https://download.csdn.net/download/peach_orange/9667070
需要下載積分,沒有積分的兄弟給我發個郵件,我郵件給你:
pantaojiacheng@163.com
3.flags標志位的具體作用:
flags標志位是用來檢測控制器與px4是否斷開的標志位。
flags=1:控制器與接收器保持連接
flags=0:控制器與接收器斷開(失控),px4會控制電機停轉。
炸過一次機,就是因為遙控器與接收器之間斷開連接了,結果這一位沒有設置,導致四軸一直按照最后一次指令在飛。
總結
以上是生活随笔為你收集整理的SBUS协议:SBUS解析与合成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LinuxC高级编程——线程间同步
- 下一篇: 验证python安装_Python环境搭