不清楚SBUS,这份SBUS协议详解请收藏

简介: 不清楚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发时,需要取反,并且是硬件取反,软件取反是无效的;硬件取反的电路图如下。

image.png


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位数据;

目录
相关文章
|
4月前
|
数据采集 网络协议 Python
🔍HTTP协议不为人知的秘密:Python网络编程高手是如何炼成的?
【7月更文挑战第29天】探索HTTP协议核心—请求与响应的交互:浏览器发送请求至服务器,后者处理后返回资源数据与状态码(如200表示成功)。Python高手需理解这些机制并掌握工具如`requests`库。HTTP头信息(Headers)含元数据如`User-Agent`、`Content-Type`及`Cookie`用于会话管理。尽管HTTP无状态,但可通过`Cookie`和`Session`模拟状态保持。成为高手之路包括:深入理解协议、实践项目、阅读优秀库源码如`requests`、跟进新技术如HTTP/2与HTTP/3,并积极参与社区交流。
25 1
|
前端开发 网络协议 程序员
你敢信一个HTTP能打趴80%面试者?
面试一年多,每当我问起面试者对HTTP的了解时,个个回答令我瞠目结舌,这些开发者都有3-5年的经验。请不要让我叫你野生程序员,是时候了解HTTP了,让我们当个正规军。
|
XML 网络协议 数据格式
科普一次,协议状态码,可别在面试疏忽了
还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群
|
Web App开发 存储 网络协议
一篇文章帮你拿下面试八股文之网络三次握手四次挥手, HTTP超文本传输协议重点理论刨析到实现简单的HTTP服务, 思考着图解着学习网络 (咱不死记硬背)
一篇文章帮你拿下面试八股文之网络三次握手四次挥手, HTTP超文本传输协议重点理论刨析到实现简单的HTTP服务, 思考着图解着学习网络 (咱不死记硬背)
一篇文章帮你拿下面试八股文之网络三次握手四次挥手, HTTP超文本传输协议重点理论刨析到实现简单的HTTP服务, 思考着图解着学习网络 (咱不死记硬背)
|
域名解析 网络协议 安全
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(1)
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(1)
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(1)
|
网络协议 网络性能优化 网络安全
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(2)
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(2)
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(2)
|
存储 JSON 缓存
和面试官畅谈「HTTP协议」
在计算机网络这一重要大模块中,我们已经学习过了IP、TCP、UDP等协议,本文我们主要来介绍在TCP/IP五层协议栈中,处于应用层的应用非常广泛的协议——HTTP协议,该协议也是咱们在日后开发中用的最多的协议。
153 0
和面试官畅谈「HTTP协议」
|
JSON Java 数据格式
面试突击64:了解 HTTP 协议吗?
面试突击64:了解 HTTP 协议吗?
126 0
|
网络协议 前端开发 网络安全
前端百题斩【033-034】——网络七层模型及HTTP进化史
前端百题斩【033-034】——网络七层模型及HTTP进化史
前端百题斩【033-034】——网络七层模型及HTTP进化史
|
存储 缓存 自然语言处理
搞定服务器面试 - HTTP协议知识点整理
HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议) 的缩写,是用于浏览器与服务器之间传输文字、图片、音频、视频等超文本数据的约定和规范。