日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SBUS总线

發布時間:2023/12/20 编程问答 98 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SBUS总线 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SBUS是一個接收機串行總線輸出,通過這根總線,可以獲得遙控器上所有通道的數據。目前很多模型及無人機電子設備都支持SBUS總線的接入。使用SBUS總線獲取通道數據,效率高的,而且節省硬件資源,只需要一根線即可獲取所有通道的數據。

擴展資料:

SBUS總線使用的是TTL電平的反向電平,即標準TTL中的1取反為0,而0則取反為1,串口波特率為100000,數據位為8位,2個停止位,偶校驗。

SBUS一幀數據的長度為25個字節,其中第"0"個字節為幀頭:0x0f;第24個字節為幀尾:0x00;從第1個字節到第22個字節為1-16號比例通道的數據字節;第23字節中,第7位為數字開關通道17通道,第6位為數字開關通道18通道。

第5位為幀狀態標志為(判斷是否丟幀),用于控制接收機上的LED的狀態,第4位為失控保護激活標志位,此位為1時,表示接收機進入失控保護狀態。


?


?

1、簡介
SBUS本質是一種串口通信協議,采用100K的波特率,8位數據位,兩位停止位,偶效驗,即8E2的串口通信。

值得注意的有三點:

1.SBUS采用負邏輯,所以無論接收還是發送都要進行硬件取反(注意,一定要硬件取反),電路如下

這是我在網上看資料時看到的電路,實際上我用的是下面這個電路

2.SBUS有兩種模式,

??????a.高速模式:每4ms發送一次

??????b.低速模式:每14ms發送一次

???就是說每間隔4或者14ms這個串口就發送25個字節的數據,這25個字節的數據最多可以包含16個信息

3.100K的波特率不是標準波特率,一般串口工具都不能直接讀取(所以不要直接用電腦調試,除非你的電腦寫好了非標準串口),可以用單片機讀取。

?

2.具體協議的格式如下:
????????[數據頭] [第一個字節] [第二個字節] ......[第二十二的字節] [標志位] [數據尾]

數據頭、標志位、數據尾 不攜帶信息,而且數據頭和數據尾是固定的,數據頭=0x0f;?數據尾=0x00;?

數據頭(1字節)+數據(22字節)+標志位(1字節)+數據尾(1字節)

?

3.編解碼C語言源碼?
編碼原理

???????一個信息是二進制的11bit,比如1111 1111 111就可以表示一個信息,一共16個這樣的信息,按照順序將這16個信息依次排成一串,得到一個176bit(11 *16)的數據,也就是22字節(176 / 8 = 22)的數據,再加上數據頭數據尾校驗位就組成了一個要通過串口傳送的信息。每隔4或者14ms就傳送一個這樣的信息。

??????所以這16個信息每一個所能表示的最大值是2^11 = 2048,也就是他的精度。

??????標志位

??????標志位的高四位有特殊含義,第四位并沒有使用,依照我的理解,第七位和第六位表示兩個數字通道(通道17和18)信息(就是只有高低電平的通道,一般用來控制通斷或者某個電機簡單的啟動或者停止,比如1表示啟動電機0表示停止電機),第五位表示幀丟失,接收機紅色LED亮起,我的理解是,如果這一位為1,表示這一幀信號出問題了,接收機紅色LED亮起。第四位表示故障保護激活,意思應該是說如果這一位為1,激活接受方故障保護。

?????bit7 = ch17 = digital channel (0x80)
?????bit6 = ch18 = digital channel (0x40)
?????bit5 = Frame lost, equivalent red LED on receiver (0x20)
?????bit4 = failsafe activated (0x10)
?????bit3 = n/a
?????bit2 = n/a
?????bit1 = n/a
?????bit0 = n/a

??解碼代碼
??????buffer[]對應接收到的數據

???????_channels[]對應通道

_channels[0] ?= ((buffer[1]|buffer[2]<<8) ? ? ? ? ? ? ? ? ? ? ?& 0x07FF);
_channels[1] ?= ((buffer[2]>>3 |buffer[3]<<5) ? ? ? ? ? ? ? ? & 0x07FF);
_channels[2] ?= ((buffer[3]>>6 |buffer[4]<<2 |buffer[5]<<10) ?& 0x07FF);
_channels[3] ?= ((buffer[5]>>1 |buffer[6]<<7) ? ? ? ? ? ? ? ? & 0x07FF);
_channels[4] ?= ((buffer[6]>>4 |buffer[7]<<4) ? ? ? ? ? ? ? ? & 0x07FF);
_channels[5] ?= ((buffer[7]>>7 |buffer[8]<<1 |buffer[9]<<9) ? & 0x07FF);
_channels[6] ?= ((buffer[9]>>2 |buffer[10]<<6) ? ? ? ? ? ? ? ?& 0x07FF);
_channels[7] ?= ((buffer[10]>>5|buffer[11]<<3) ? ? ? ? ? ? ? ?& 0x07FF);
_channels[8] ?= ((buffer[12] ? |buffer[13]<<8) ? ? ? ? ? ? ? ?& 0x07FF);
_channels[9] ?= ((buffer[13]>>3|buffer[14]<<5) ? ? ? ? ? ? ? ?& 0x07FF);
_channels[10] = ((buffer[14]>>6|buffer[15]<<2|buffer[16]<<10) & 0x07FF);
_channels[11] = ((buffer[16]>>1|buffer[17]<<7) ? ? ? ? ? ? ? ?& 0x07FF);
_channels[12] = ((buffer[17]>>4|buffer[18]<<4) ? ? ? ? ? ? ? ?& 0x07FF);
_channels[13] = ((buffer[18]>>7|buffer[19]<<1|buffer[20]<<9) ?& 0x07FF);
_channels[14] = ((buffer[20]>>2|buffer[21]<<6) ? ? ? ? ? ? ? ?& 0x07FF);
_channels[15] = ((buffer[21]>>5|buffer[22]<<3) ? ? ? ? ? ? ? ?& 0x07FF);
??編碼代碼
?
?? ?// SBUS header
?? ?packet[0] = 0x0F;?
?? ?// 16 channels of 11 bit data
?? ?packet[1] ?= (unsigned char) ((channels[0] & 0x07FF));
?? ?packet[2] ?= (unsigned char) ((channels[0] & 0x07FF)>>8 ? | (channels[1] & 0x07FF)<<3);
?? ?packet[3] ?= (unsigned char) ((channels[1] & 0x07FF)>>5 ? | (channels[2] & 0x07FF)<<6);
?? ?packet[4] ?= (unsigned char) ((channels[2] & 0x07FF)>>2);
?? ?packet[5] ?= (unsigned char) ((channels[2] & 0x07FF)>>10 ?| (channels[3] & 0x07FF)<<1);
?? ?packet[6] ?= (unsigned char) ((channels[3] & 0x07FF)>>7 ? | (channels[4] & 0x07FF)<<4);
?? ?packet[7] ?= (unsigned char) ((channels[4] & 0x07FF)>>4 ? | (channels[5] & 0x07FF)<<7);
?? ?packet[8] ?= (unsigned char) ((channels[5] & 0x07FF)>>1);
?? ?packet[9] ?= (unsigned char) ((channels[5] & 0x07FF)>>9 ? | (channels[6] & 0x07FF)<<2);
?? ?packet[10] = (unsigned char) ((channels[6] & 0x07FF)>>6 ? | (channels[7] & 0x07FF)<<5);
?? ?packet[11] = (unsigned char) ((channels[7] & 0x07FF)>>3);
?? ?packet[12] = (unsigned char) ((channels[8] & 0x07FF));
?? ?packet[13] = (unsigned char) ((channels[8] & 0x07FF)>>8 ? | (channels[9] & 0x07FF)<<3);
?? ?packet[14] = (unsigned char) ((channels[9] & 0x07FF)>>5 ? | (channels[10] & 0x07FF)<<6); ?
?? ?packet[15] = (unsigned char) ((channels[10] & 0x07FF)>>2);
?? ?packet[16] = (unsigned char) ((channels[10] & 0x07FF)>>10 | (channels[11] & 0x07FF)<<1);
?? ?packet[17] = (unsigned char) ((channels[11] & 0x07FF)>>7 ?| (channels[12] & 0x07FF)<<4);
?? ?packet[18] = (unsigned char) ((channels[12] & 0x07FF)>>4 ?| (channels[13] & 0x07FF)<<7);
?? ?packet[19] = (unsigned char) ((channels[13] & 0x07FF)>>1);
?? ?packet[20] = (unsigned char) ((channels[13] & 0x07FF)>>9 ?| (channels[14] & 0x07FF)<<2);
?? ?packet[21] = (unsigned char) ((channels[14] & 0x07FF)>>6 ?| (channels[15] & 0x07FF)<<5);
?? ?packet[22] = (unsigned char) ((channels[15] & 0x07FF)>>3);
? ? // flags
?? ?packet[23] = 0x00;
?? ?// footer
?? ?packet[24] = 0X00;
?


?

?

?

總結

以上是生活随笔為你收集整理的SBUS总线的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。