不清楚SBUS,这份SBUS协议详解请收藏
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协议详解请收藏相关推荐
- 二级建造师考试内容详解-请收藏
2021二级建造师考试还有大概还有80天,时间紧迫在这里再给大家强调一下,二建考试的内容. 这里给大家整理了2021年二级建造师实务考试各专业涉及的考试内容.希望对大家有所帮助. 二级建造师考试分3 ...
- 转:SSL 握手协议详解
SSL 握手协议详解 RSA作为身份认证,ECDHE来交换加密密钥,AES/DES等作为加密. 如果RSA来加解密,那么身份认证后,直接用认证后的RSA公钥解密.不需要再额外交换加密密钥了. 相关报文 ...
- zz:NETCONF协议详解
随着SDN的大热,一个诞生了十年之久的协议焕发了第二春,它就是NETCONF协议.如果你在两年前去搜索NETCONF协议,基本得到的信息都是"这个协议是一个网管协议,主要目的是弥补SNMP协 ...
- TCP/IP网络协议栈:ARP协议详解
<TCP/IP网络协议栈:以太网数据包结构.802.3> <TCP/IP网络协议栈:ARP协议详解> <TCP / IP攻击:ARP缓存中毒的基本原理.TCP序列号预测和 ...
- 《TCP IP协议 详解》思考总结 · 三
前言 这一篇文章主要围绕了IP协议,ICMP协议和UDP协议展开,希望可以在这里大概做一个总结,将<TCP/IP协议详解 卷一>书中TCP相关章节前面的内容做一个结束,在下一篇文章专心的去 ...
- 李昱:腾讯产品登录协议详解
写下这个标题的时候,您可能要问腾讯产品登录协议有什么用?很简单,qq所有产品都是采用统一的登录协议加密登录的.也就是说,当您能够通过使用它的协议来登录并获取到令牌后,那么就可以任意的使用qq的各项产品 ...
- NETCONF协议详解
目录 目录 概述 NETCONF11协议详解 1 安全传输层 2 消息层 21 hello 211 几种常用的能力 22 rpc和rpc-reply 23 notification 3 操作层 31 ...
- ARP地址解析协议详解
ARP地址解析协议详解 网络层的ARP协议完成IP地址与物理地址的映射.首先,每台主机都会在自己的ARP缓冲区中建立一个ARP缓存表,以表示IP地址和MAC地址的对应关系.当源主机需要将一个数据包发送 ...
- IP协议和TCP协议详解
IP协议和TCP协议详解 IP协议 IP协议的特点 IPV4头部信息 IP分片 重定向 IPV6头部结构 TCP协议 TCP协议的特点 TCP头部结构 TCP连接的建立与关闭 异常终止连接 异常终止连 ...
最新文章
- python数据库查询不出结果_记一次pymysql查询不到表中最新插入的数据的问题
- 关于:项“ConnectionString”已添加
- 设置电脑背景颜色为保护眼睛的颜色
- mysql function_MySQL里event_ scheduler导致复制中断的故障分析-爱可生
- Windows环境下文件的彻底删除与恢复,推荐几个工具(整理)
- jquery获取html页面参数乱码,JS或Jquery获取浏览器URL的参数值 汉字值乱码 并转码...
- 35岁,搞过超高并发架构,依然没看懂字节的推荐系统!
- php与ajax交互中文乱码(字符串转化)
- python 字典和列表的遍历
- python开发软件的实例-这可能是最好玩的python GUI入门实例!
- 不显示负频率的部分,坐标轴转换为频率,幅值量纲还原改善频谱图以及功率谱和对数功率谱
- oracle VM manager 3.1 试验备忘录
- hashmap java 排序_HashMap的排序
- S3C2440裸机------GPIO
- 【MySQL学习】3、MySQL视图
- 如何使用保存实例状态保存活动状态?
- API实现快速转换简体字与繁体字
- txt.......
- 把C盘的用户Users文件移动到D盘最简单的方法【转】
- Qt Charts示例
热门文章
- tcp 组播_深入了解TCP/IP协议
- 计算机桌面变色怎么办,电脑屏幕变色了怎么办
- 不需要英语的计算机行业,北京评职称不再考外语计算机 将涉及300多万人
- zblog修改上传服务器,【记录有用】ZBlog备份、恢复与搬家(换空间换服务器)方法...
- html页面画一个矩形,使用HTML5 canvas绘制一个矩形的方法
- linux 系统命令和方法
- Test on 01/19/2019
- 使用android日志工具
- [NOIp2017] 时间复杂度
- Javascript面向对象全面剖析 —创建对象