1、简介

SBUS,全称Serial Bus,即串行通信总线。本质上是一种串口通信协议,采用100K的波特率,8位数据位,2位停止位,偶效验,即8E2的串口通信。

2、串口配置

100k波特率,8位数据位(在stm32中要选择9位),偶校验(EVEN),2位停止位,无控流,25个字节。

3、协议格式

[startbyte] [data1][data2]…[data22][flags][endbyte]

startbyte=0x0f;
endbyte=0x00;

flags标志位是用来检测控制器与px4是否断开的标志位:
flags=1:控制器与接收器保持连接;
flags=0:控制器与接收器断开(失控),px4会控制电机停转。

data1…data22:对应16个通道(ch1-ch16),每个通道11bit(22X8=16X11=176)
数据范围在0-2047之间,基本上是282~1722,中值为1002;

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=1 8;
ch10=4 7;
ch11=7 4;
ch12=2 8 1;
ch13=5 6;
ch14=8 3;
ch15=3 8;
ch16=8 5;

4、取反问题

用stm32中给px4发时,需要取反,并且是硬件取反,软件取反是无效的;硬件取反的电路图如下。

5、间隔问题

它分两种模式(高速模式和普通模式)
高速模式:每隔7ms一帧数据,因为两帧的间隔只有超过3ms,才会被接受;
而根据波特率计算一下,发送25字节需要的时间+3~4ms=7ms
普通模式:每隔14ms一帧数据;

6、数据解析与合并

#include "Sbus.h"
#include "bsp_usart1.h"
#include "string.h"uint16_t values[16]={0};void sbus_out(uint16_t num_values)
{int i=0;uint16_t value=0;uint8_t byteindex = 1;uint8_t offset = 0;uint8_t oframe[25] = { 0 };memset(oframe,0,25);oframe[0]=0x0f;oframe[24]=0x00;for (i = 0; (i < num_values) && (i < 16); ++i){value = (unsigned short)(((values[i] - SBUS_SCALE_OFFSET) / SBUS_SCALE_FACTOR) + .5f);if (value > 0x07ff){value = 0x07ff;}while (offset >= 8){++byteindex;offset -= 8;}oframe[byteindex] |= (value << (offset)) & 0xff;oframe[byteindex + 1] |= (value >> (8 - offset)) & 0xff;oframe[byteindex + 2] |= (value >> (16 - offset)) & 0xff;offset += 11;}for (i=0;i<25;i++){while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);USART_SendData(USART1, (uint16_t)oframe[i]);     }
}void sbus_decode(unsigned char *frame)
{unsigned int pick=0,channel=0,value1=0,piece=0;const struct sbus_bit_pick *decode;for (channel = 0; channel < 16; channel++) {value1 = 0;for (pick = 0; pick < 3; pick++) {decode = &sbus_decoder[channel][pick];if (decode->mask != 0) {piece = frame[1 + decode->byte];piece >>= decode->rshift;piece &= decode->mask;piece <<= decode->lshift;piece &= 0x07ff;value1 |= piece;}}values[channel] = (uint16_t)(value1 * SBUS_SCALE_FACTOR + .5f) + SBUS_SCALE_OFFSET;if(channel==1){values[channel]=3029-values[channel];}}
}

合成函数:
void sbus_out(uint16_t num_values);
//参数为通道数;
values[16]就是对应的16个通道;
解析函数:
void sbus_decode(unsigned char *frame);
//frame为25个u8位数据;


参考大佬的文章链接:
https://blog.csdn.net/uunubt/article/details/101712492?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-0&spm=1001.2101.3001.4242

https://blog.csdn.net/uunubt/article/details/101712492?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-0&spm=1001.2101.3001.4242

安装nvidia驱动只能显示扩展屏,卸载nvidia驱动只能显示主屏幕,二者不可得兼,两小时在安装驱动解决显示问题。有时候不完整就不完整吧,不是所有东西都能顺利解决,既然解决不了为何不调整心态做其他事情。

不清楚SBUS,这份SBUS协议详解请收藏相关推荐

  1. 二级建造师考试内容详解-请收藏

    ​2021二级建造师考试还有大概还有80天,时间紧迫在这里再给大家强调一下,二建考试的内容. 这里给大家整理了2021年二级建造师实务考试各专业涉及的考试内容.希望对大家有所帮助. 二级建造师考试分3 ...

  2. 转:SSL 握手协议详解

    SSL 握手协议详解 RSA作为身份认证,ECDHE来交换加密密钥,AES/DES等作为加密. 如果RSA来加解密,那么身份认证后,直接用认证后的RSA公钥解密.不需要再额外交换加密密钥了. 相关报文 ...

  3. zz:NETCONF协议详解

    随着SDN的大热,一个诞生了十年之久的协议焕发了第二春,它就是NETCONF协议.如果你在两年前去搜索NETCONF协议,基本得到的信息都是"这个协议是一个网管协议,主要目的是弥补SNMP协 ...

  4. TCP/IP网络协议栈:ARP协议详解

    <TCP/IP网络协议栈:以太网数据包结构.802.3> <TCP/IP网络协议栈:ARP协议详解> <TCP / IP攻击:ARP缓存中毒的基本原理.TCP序列号预测和 ...

  5. 《TCP IP协议 详解》思考总结 · 三

    前言 这一篇文章主要围绕了IP协议,ICMP协议和UDP协议展开,希望可以在这里大概做一个总结,将<TCP/IP协议详解 卷一>书中TCP相关章节前面的内容做一个结束,在下一篇文章专心的去 ...

  6. 李昱:腾讯产品登录协议详解

    写下这个标题的时候,您可能要问腾讯产品登录协议有什么用?很简单,qq所有产品都是采用统一的登录协议加密登录的.也就是说,当您能够通过使用它的协议来登录并获取到令牌后,那么就可以任意的使用qq的各项产品 ...

  7. NETCONF协议详解

    目录 目录 概述 NETCONF11协议详解 1 安全传输层 2 消息层 21 hello 211 几种常用的能力 22 rpc和rpc-reply 23 notification 3 操作层 31 ...

  8. ARP地址解析协议详解

    ARP地址解析协议详解 网络层的ARP协议完成IP地址与物理地址的映射.首先,每台主机都会在自己的ARP缓冲区中建立一个ARP缓存表,以表示IP地址和MAC地址的对应关系.当源主机需要将一个数据包发送 ...

  9. IP协议和TCP协议详解

    IP协议和TCP协议详解 IP协议 IP协议的特点 IPV4头部信息 IP分片 重定向 IPV6头部结构 TCP协议 TCP协议的特点 TCP头部结构 TCP连接的建立与关闭 异常终止连接 异常终止连 ...

最新文章

  1. python数据库查询不出结果_记一次pymysql查询不到表中最新插入的数据的问题
  2. 关于:项“ConnectionString”已添加
  3. 设置电脑背景颜色为保护眼睛的颜色
  4. mysql function_MySQL里event_ scheduler导致复制中断的故障分析-爱可生
  5. Windows环境下文件的彻底删除与恢复,推荐几个工具(整理)
  6. jquery获取html页面参数乱码,JS或Jquery获取浏览器URL的参数值 汉字值乱码 并转码...
  7. 35岁,搞过超高并发架构,依然没看懂字节的推荐系统!
  8. php与ajax交互中文乱码(字符串转化)
  9. python 字典和列表的遍历
  10. python开发软件的实例-这可能是最好玩的python GUI入门实例!
  11. 不显示负频率的部分,坐标轴转换为频率,幅值量纲还原改善频谱图以及功率谱和对数功率谱
  12. oracle VM manager 3.1 试验备忘录
  13. hashmap java 排序_HashMap的排序
  14. S3C2440裸机------GPIO
  15. 【MySQL学习】3、MySQL视图
  16. 如何使用保存实例状态保存活动状态?
  17. API实现快速转换简体字与繁体字
  18. txt.......
  19. 把C盘的用户Users文件移动到D盘最简单的方法【转】
  20. Qt Charts示例

热门文章

  1. tcp 组播_深入了解TCP/IP协议
  2. 计算机桌面变色怎么办,电脑屏幕变色了怎么办
  3. 不需要英语的计算机行业,北京评职称不再考外语计算机 将涉及300多万人
  4. zblog修改上传服务器,【记录有用】ZBlog备份、恢复与搬家(换空间换服务器)方法...
  5. html页面画一个矩形,使用HTML5 canvas绘制一个矩形的方法
  6. linux 系统命令和方法
  7. Test on 01/19/2019
  8. 使用android日志工具
  9. [NOIp2017] 时间复杂度
  10. Javascript面向对象全面剖析 —创建对象