1、简介

SBUS本质是一种串口通信协议,采用100K的波特率,8位数据位,两位停止位,偶效验,即8E2的串口通信。

值得注意的有三点:

1.SBUS采用负逻辑,所以无论接收还是发送都要进行硬件取反(注意,一定要硬件取反),电路如下

这是我在网上看资料时看到的电路,实际上我用的是7404电路

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[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;

————————————————
版权声明:本文为CSDN博主「Bluish White」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31232793/article/details/80244211

SBUS协议及编解码相关推荐

  1. 【TARS】TARS协议的编解码

    目录 0.现有编解码方式 1.编解码 2.TARS底层协议 3.TUP 3.1TUP是什么 3.2TUP能做什么 3.3TUP不能做什么 3.4依赖和约束  4.TARS协议的序列化与反序列化调用的函 ...

  2. Mina Codec Filter对应协议实现编解码处理

    原文地址:Mina Filter(Apache Mina user guide Chapter 9 Codec Filter) 本教程试图解释为什么以及如何使用ProtocolCodecFilter. ...

  3. 基于Android O8.1的ffmpeg NDK 开发 - 2 - APP显示ffmpeg所支持协议,编解码,过滤器,格式,配置等信息

    我们今天的目标是仿照雷神的博客(https://blog.csdn.net/leixiaohua1020/article/details/47008825),把这个APP写出来,先上图: APP中有5 ...

  4. Netty使用篇:Http协议编解码

    第一章:概述 Http协议是一个应用层协议.在Http协议之上又构建出来了WebSocket这种双向通信的协议.可以主动在服务端帮我们去推数据,实际上我们现在做一些双向通信的比较很重要的东西,比如:推 ...

  5. mina自定义编解码

    Mina自定义编解码 Mina初了自己定义的字符编码外,用户还可以根据自己的协议自定义编解码.由于mina是基于IoFilter,也就是通过IoFilter拦截和过滤IO中的各种信息.因此对于编码而言 ...

  6. aac蓝牙编解码协议_蓝牙音频编码哪个音质好?今天我们来逐一解读

    家有影院致力于帮助渴望学习.热爱电影.希望通过自己双手搭建出适合自己的家庭影院的朋友.如果你是这样的人,我们和500位同样热爱家庭影院的伙伴愿意一起帮助你实现梦想.同时,我们还能帮助你找到价格优惠的靠 ...

  7. aac蓝牙编解码协议_最新的真无线蓝牙耳机选购指南

    点击蓝字 关注我们 真无线蓝牙耳机选购指南 蓝牙耳机真无线的一些科普内容 解码方案: 目前流行的解码方案包括SBC.apt-X.AAC.LDAC和三星的Scalable与华为HWA独家技术.使用SBC ...

  8. SBUS协议转换芯片,SBUS转UART,sbus转rs232,sbus解码IC,zr003

    sbus 协议比较复杂.16通道一共用了22字节.每个通道占11bit.所以会存在拼字节错位的问题.需要转化成一个整形的数据.这对一般的主控还是有压力,开销不少.今天跟大家分享一个专用的sbus解码芯 ...

  9. Dubbo篇:基于Netty实现Dubbo协议编解码源码分析

    Dubbo协议解析 Dubbo协议设计参考了TCP/IP协议,包括协议头和协议体两部分.16字节报文头主要携带了魔法数(0xdabb,用于分割两个不同请求),以及当前请求报文是否是Request.Re ...

最新文章

  1. python for i in range 三维_python中的三维卷积
  2. codeforces 940D 比赛总结
  3. double 直接舍去 保留两位小数
  4. ui uview 安卓开发_uni-app UI框架之uview-ui使用教程
  5. 一些SAP UI5代码审查的例子
  6. NMS_非极大值抑制(转)
  7. 周杰伦新歌《说好不哭》上线,程序员哭了......【华为云分享】
  8. oracle本地没装 配置,数据库--oracle安装配置(本地安装的步骤及各种问题解决方案)...
  9. mysql中只运行一部分数据_MySQL(一)——MySQL基础和部分面试题
  10. esp8266WIFI模块教程:正点原子ATK-ESP8266进行网络通信,单片机与电脑,单片机与手机发送数据
  11. 构建会员运营管理系统 帮助零售企业数字化转型
  12. python模拟登陆GDUFE教学一体化平台
  13. 数字信号与模拟信号的区别是什么?
  14. CSS 定位(position)
  15. 如何从窗口句柄得到窗口的指针
  16. python亲密度_人际沟通入门(认清沟通高手的特质)
  17. 冻结训练的理解与使用
  18. Tensorflow书推荐,深度学习书推荐
  19. python 基础代谢率计算_计算基础代谢率(BMR)
  20. java 多字段搜索_Elasticsearch系列---多字段搜索

热门文章

  1. RabbitMq、ActiveMq、ZeroMq、kafka比较
  2. docker:轻量级图形页面管理工具Portainer
  3. AngularJS基础入门初探
  4. Linux的环境中如何生成srw-rw---- 的文件权限?
  5. CentOS 安装最新版本 Git
  6. C++网易云课堂开发工程师--转换函数
  7. 编译wxWidgets
  8. 关于Tomcat配置虚拟路径保存、访问图片
  9. 手势UITapGestureRecognizer的tag
  10. T-SQL中的透视和逆透视