遥控器协议解析—SBUS篇

遥控器协议解析—SBUS篇SBUS 全称 serial bus 是一种串口通信协议 仅用一根信号线就能传输多达 16 通道的数据 比多路 PWM 捕获高效且省资源

大家好,欢迎来到IT知识分享网。

遥控器协议解析—SBUS篇

1、SBUS信号解析

SBUS全称serial-bus,是一种串口通信协议,仅用一根信号线就能传输多达16通道的数据,比多路PWM捕获高效且省资源。


2、SBUS硬件反相器电路设计

接收机接在板子上必须加入硬件反相器,因为SBUS的信号是采用的负逻辑,也就是电平相反,只能在硬件上进行反相,在软件上无法操作。

3、程序实现

需要注意的是HAL库串口中断一次后需要再开启中断才能进行下次中断

#define SBUS_DATA_SIZE 25 // 25字节 struct SBUS_t{ 
     uint16_t ch[16]; // 16个字节数据 }; uint8_t sbus_rx_sta = 0; // sbus 接收状态,0:未完成,1:已完成一帧接收 uint8_t sbus_rx_buf[SBUS_DATA_SIZE]; // 接收sbus数据缓冲区 uint8_t connect_flag = flase; // 连接是否正常 struct SBUS_t sbus; // SBUS 结构体实例化 void SBUS_IT_Open(void) { 
     HAL_UARTEx_ReceiveToIdle_IT(&huart4, (uint8_t *)sbus_rx_buf, SBUS_DATA_SIZE); } void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { 
     if(huart->Instance == USART6){ 
     if ((sbus_rx_buf[0] == 0x0F)&&sbus_rx_buf[24]==0x00) { 
     sbus_rx_sta = 1; } else { 
     sbus_rx_sta=0; } if(sbus_rx_sta==1) { 
     sbus.ch[0] =((sbus_rx_buf[2]<<8) + (sbus_rx_buf[1])) & 0x07ff; sbus.ch[1] =((sbus_rx_buf[3]<<5) + (sbus_rx_buf[2]>>3)) & 0x07ff; sbus.ch[2] =((sbus_rx_buf[5]<<10) + (sbus_rx_buf[4]<<2) + (sbus_rx_buf[3]>>6)) & 0x07ff; sbus.ch[3] =((sbus_rx_buf[6]<<7) + (sbus_rx_buf[5]>>1)) & 0x07ff; sbus.ch[4] =((sbus_rx_buf[7]<<4) + (sbus_rx_buf[6]>>4)) & 0x07ff; sbus.ch[5] =((sbus_rx_buf[9]<<9) + (sbus_rx_buf[8]<<1) + (sbus_rx_buf[7]>>7)) & 0x07ff; sbus.ch[6] =((sbus_rx_buf[10]<<6) + (sbus_rx_buf[9]>>2)) & 0x07ff; sbus.ch[7] =((sbus_rx_buf[11]<<3) + (sbus_rx_buf[10]>>5)) & 0x07ff; sbus.ch[8] =((sbus_rx_buf[13]<<8) + (sbus_rx_buf[12])) & 0x07ff; sbus.ch[9] =((sbus_rx_buf[14]<<5) + (sbus_rx_buf[13]>>3)) & 0x07ff; sbus.ch[10]=((sbus_rx_buf[16]<<10) + (sbus_rx_buf[15]<<2) + (sbus_rx_buf[14]>>6)) & 0x07ff; sbus.ch[11]=((sbus_rx_buf[17]<<7) + (sbus_rx_buf[16]>>1)) & 0x07ff; sbus.ch[12]=((sbus_rx_buf[18]<<4) + (sbus_rx_buf[17]>>4)) & 0x07ff; sbus.ch[13]=((sbus_rx_buf[20]<<9) + (sbus_rx_buf[19]<<1) + (sbus_rx_buf[18]>>7)) & 0x07ff; sbus.ch[14]=((sbus_rx_buf[21]<<6) + (sbus_rx_buf[20]>>2)) & 0x07ff; sbus.ch[15]=((sbus_rx_buf[22]<<3) + (sbus_rx_buf[21]>>5)) & 0x07ff; if(sbus_rx_buf[21] != 0x00)connect_flag = flase; else connect_flag = ture; sbus_rx_sta = 0; // 准备下一次接收 } SBUS_IT_Open(); } } 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/110181.html

(0)
上一篇 2026-02-02 11:15
下一篇 2026-02-02 11:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信