使用stm32编码SBUS信号_hal库

3 篇文章 0 订阅
2 篇文章 0 订阅

什么是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);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值