ESP8266解析S-BUS协议

Talk is cheap, show you code!
编译平台:Arduino IDE

/**
 *  功能:软件串口读取S-BUS数据;解析;串口打印
 */
#include <SoftwareSerial.h>
#define None 5//D1(空)
#define DataPort 14//D5

uint8_t Data_packet[26];
uint16_t CH[16];  // 通道值

//声明一个软件串口
SoftwareSerial swSerial;

void setup() 
{
  Serial.begin(115200);   
  //设置软件串口波特率  
  //begin(uint32_t baud, SoftwareSerialConfig config,int8_t rxPin, int8_t txPin, bool invert,int Data_packetCapacity = 64, int isrData_packetCapacity = 0);
  swSerial.begin(100000,SWSERIAL_8E2,DataPort,None,true);
}

void loop() 
{
  readSerial();
  Sbus_Data_Count();
  DebugPrint();
}

void DebugPrint()
{
  //Serial.printf("%4d ",Data_packet[1]);//0x0F
  for(int i=0;i<6;i++)//mc6c遥控器只有6个通道
  {
    Serial.printf("%4d ",CH[i]);
  }
  Serial.println();
  //Serial.printf("%4d\n",Data_packet[25]);//0x00

  /*for(int i=1;i<=25;i++)
  {
    Serial.printf("%4d ",Data_packet[i]);
  }
  Serial.println("");*/
}

void readSerial()
{
  for(int i=1;i<=25;i++)
  {
    if(swSerial.available())
    {
      Data_packet[i] = swSerial.read();
      //Serial.printf("Byte%d:%d\n",i,Data_packet[i]);
    }
  }
}

void Sbus_Data_Count()
{
  CH[ 0] = ((int16_t)Data_packet[ 2] >> 0 | ((int16_t)Data_packet[ 3] << 8 )) & 0x07FF;
  CH[ 1] = ((int16_t)Data_packet[ 3] >> 3 | ((int16_t)Data_packet[ 4] << 5 )) & 0x07FF;
  CH[ 2] = ((int16_t)Data_packet[ 4] >> 6 | ((int16_t)Data_packet[ 5] << 2 )  | (int16_t)Data_packet[ 6] << 10 ) & 0x07FF;
  CH[ 3] = ((int16_t)Data_packet[ 6] >> 1 | ((int16_t)Data_packet[ 7] << 7 )) & 0x07FF;
  CH[ 4] = ((int16_t)Data_packet[ 7] >> 4 | ((int16_t)Data_packet[ 8] << 4 )) & 0x07FF;
  CH[ 5] = ((int16_t)Data_packet[ 8] >> 7 | ((int16_t)Data_packet[ 9] << 1 )  | (int16_t)Data_packet[10] <<  9 ) & 0x07FF;
  CH[ 6] = ((int16_t)Data_packet[10] >> 2 | ((int16_t)Data_packet[11] << 6 )) & 0x07FF;
  CH[ 7] = ((int16_t)Data_packet[11] >> 5 | ((int16_t)Data_packet[12] << 3 )) & 0x07FF;
  
  CH[ 8] = ((int16_t)Data_packet[13] << 0 | ((int16_t)Data_packet[14] << 8 )) & 0x07FF;
  CH[ 9] = ((int16_t)Data_packet[14] >> 3 | ((int16_t)Data_packet[15] << 5 )) & 0x07FF;
  CH[10] = ((int16_t)Data_packet[15] >> 6 | ((int16_t)Data_packet[16] << 2 )  | (int16_t)Data_packet[17] << 10 ) & 0x07FF;
  CH[11] = ((int16_t)Data_packet[17] >> 1 | ((int16_t)Data_packet[18] << 7 )) & 0x07FF;
  CH[12] = ((int16_t)Data_packet[18] >> 4 | ((int16_t)Data_packet[19] << 4 )) & 0x07FF;
  CH[13] = ((int16_t)Data_packet[19] >> 7 | ((int16_t)Data_packet[20] << 1 )  | (int16_t)Data_packet[21] <<  9 ) & 0x07FF;
  CH[14] = ((int16_t)Data_packet[21] >> 2 | ((int16_t)Data_packet[22] << 6 )) & 0x07FF;
  CH[15] = ((int16_t)Data_packet[22] >> 5 | ((int16_t)Data_packet[23] << 3 )) & 0x07FF;
}

版权声明:本文为CSDN博主「feng锋~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_49597570/article/details/122749041

生成海报
点赞 0

feng锋~

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

基于STM32的室内环境监测系统

设计简介: 本设计是基于单片机的室内环境监测器,主要实现以下功能: 可实现LCD1602显示环境数据实时监测一氧化碳、甲烷、烟雾值空气质量大于各自限值报警,并通过TTS报警 标签&#x

基于stm32f407的示波器

一.设计要求 二.整体思路 硬件部分主要负责电压的缩放以及垂直灵敏度的控制,因为stm32的大部分引脚最高输入电压为3.3v,而要求的电压需要50v,需要进行电压缩放。 软件部分主要负责方波的实现&#x

实验一 stm32F407VETx点亮流水灯

二、设计指标 使电路板上的8个LED轮流点亮,并按键控制点亮速度。 三、操作 1、CubeMX操作 1.1依据开发板LED引脚设置CubeMX中8个LED的引脚为GPIO_Output模式, 2、按键设置