遥控RC SBUS和STM32通信

遥控RC SBUS和STM32通信

第一部分:操作

先来看一下我的硬件

在这里插入图片描述
在这里插入图片描述

强调一下SBUS的基本原理

  • 波特率 100K,8位数据位,2位停止位,25字节
  • 2位停止位,偶EVEN校验,无流控
  • 空闲电平是低电平,和串口相反

数据格式

01 - 222324
头=0x0F16个通道数据故障码,0正常,0x10故障尾 = 0x00

MCU型号STM32F407VET,硬件如下图

在这里插入图片描述

STM32CUBE设置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

初始化代码

/* 初始化 */
uint8_t RcUartBuff[32];
.
.
.
HAL_UARTEx_ReceiveToIdle_DMA(&huart2,RcUartBuff,32);//用IDLE和中断接收
.
/*回调函数*/
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
  //如果是DMA中断直接退出
  if(huart->RxState != HAL_UART_STATE_READY){
    return;
  }
  if(Size == 25){
    //在这里直接使用 RcUartBuff 也可以
    osMessageQueuePut(myQueueRcRXHandle,RcUartBuff,NULL,0);
  }
  HAL_UARTEx_ReceiveToIdle_DMA(&huart2,RcUartBuff,32);
}
还应该加上串口故障处理函数,防止贞错误等导致串口关闭
/* 数据解析 */
typedef struct{
  uint8_t status;
  uint16_t max;
  uint16_t mid;
  uint16_t min;
  uint16_t CH[6];
}RC_Data_t;

RC_Data_t RC_Data ={
  .max =1801,
  .mid =1000,
  .min =200
};

void Sbus_Data_Count(RC_Data_t* rc,uint8_t *buf)
{
  uint16_t* chptr =rc->CH;
	chptr[ 0] = ((int16_t)buf[ 1] >> 0 | ((int16_t)buf[ 2] << 8 )) & 0x07FF;
	chptr[ 1] = ((int16_t)buf[ 2] >> 3 | ((int16_t)buf[ 3] << 5 )) & 0x07FF;
	chptr[ 2] = ((int16_t)buf[ 3] >> 6 | ((int16_t)buf[ 4] << 2 )  | (int16_t)buf[ 5] << 10 ) & 0x07FF;
	chptr[ 3] = ((int16_t)buf[ 5] >> 1 | ((int16_t)buf[ 6] << 7 )) & 0x07FF;
	chptr[ 4] = ((int16_t)buf[ 6] >> 4 | ((int16_t)buf[ 7] << 4 )) & 0x07FF;
	chptr[ 5] = ((int16_t)buf[ 7] >> 7 | ((int16_t)buf[ 8] << 1 )  | (int16_t)buf[9] <<  9 ) & 0x07FF;
  rc->status =buf[23];
}

Sbus_Data_Count(&RC_Data,RcBuff);

第二部分:原理

留下坑吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值