什么是SBUS协议?
SBUS协议使用单线串行通信,可以传输多达16个通道的数据。每个通道的数据都是一个11位的值,范围从0到2047。SBUS数据帧的长度为25字节,包括一个起始字节、22个数据字节和两个校验字节。
编码SBUS信号
#include "stm32f1xx_hal.h"
#include "usart.h"
#define SBUS_FRAME_SIZE 25
#define SBUS_SYNCBYTE 0x0F
// channels :需要发送的遥控器16通道数字
void SBUS_Transmit(uint16_t *channels)
{
uint8_t sbusData[SBUS_FRAME_SIZE];
int i, j;
// 初始化SBUS数据帧
for (i = 0; i < SBUS_FRAME_SIZE; i++) {
sbusData[i] = 0;
}
sbusData[0] = SBUS_SYNCBYTE;
//设置SBUS数据帧的同步字节。在SBUS协议中,每个数据帧的第一个字节(索引为0的字节)是一个特定的值,通常为0x0F,用于标识数据帧的开始
//。这个特定的值被称为"同步字节"当接收设备读取数据时,它会查找这个同步字节,以确定何时开始一个新的数据帧。将sbusData[0]设置
//为SBUS_SYNCBYTE是非常重要的,否则接收设备可能无法正确地解析数据帧。
// 将通道数据编码到SBUS数据帧中
for (i = 0; i < 16; i++) {
if (i == 0) {
sbusData[1] |= (uint8_t) ((channels[0] & 0x07FF));
sbusData[2] |= (uint8_t) ((channels[0] & 0x07FF) >> 8 | (channels[1] & 0x07FF) << 3);
sbusData[3] |= (uint8_t) ((channels[1] & 0x07FF) >> 5 | (channels[2] & 0x07FF) << 6);
sbusData[4] |= (uint8_t) ((channels[2] & 0x07FF) >> 2);
sbusData[5] |= (uint8_t) ((channels[2] & 0x07FF) >> 10 | (channels[3] & 0x07FF) << 1);
sbusData[6] |= (uint8_t) ((channels[3] & 0x07FF) >> 7 | (channels[4] & 0x07FF) << 4);
sbusData[7] |= (uint8_t) ((channels[4] & 0x07FF) >> 4 | (channels[5] & 0x07FF) << 7);
sbusData[8] |= (uint8_t) ((channels[5] & 0x07FF) >> 1);
sbusData[9] |= (uint8_t) ((channels[5] & 0x07FF) >> 9 | (channels[6] & 0x07FF) << 2);
sbusData[10] |= (uint8_t) ((channels[6] & 0x07FF) >> 6 | (channels[7] & 0x07FF) << 5);
sbusData[11] |= (uint8_t) ((channels[7] & 0x07FF) >> 3);
} else if (i == 8) {
sbusData[12] |= (uint8_t) ((channels[8] & 0x07FF));
sbusData[13] |= (uint8_t) ((channels[8] & 0x07FF) >> 8 | (channels[9] & 0x07FF) << 3);
sbusData[14] |= (uint8_t) ((channels[9] & 0x07FF) >> 5 | (channels[10] & 0x07FF) << 6);
sbusData[15] |= (uint8_t) ((channels[10] & 0x07FF) >> 2);
sbusData[16] |= (uint8_t) ((channels[10] & 0x07FF) >> 10 | (channels[11] & 0x07FF) << 1);
sbusData[17] |= (uint8_t) ((channels[11] & 0x07FF) >> 7 | (channels[12] & 0x07FF) << 4);
sbusData[18] |= (uint8_t) ((channels[12] & 0x07FF) >> 4 | (channels[13] & 0x07FF) << 7);
sbusData[19] |= (uint8_t) ((channels[13] & 0x07FF) >> 1);
sbusData[20] |= (uint8_t) ((channels[13] & 0x07FF) >> 9 | (channels[14] & 0x07FF) << 2);
sbusData[21] |= (uint8_t) ((channels[14] & 0x07FF) >> 6 | (channels[15] & 0x07FF) << 5);
sbusData[22] |= (uint8_t) ((channels[15] & 0x07FF) >> 3);
}
}
// 发送SBUS数据
HAL_UART_Transmit(&huart1, sbusData, SBUS_FRAME_SIZE, 1000);
}