位运算及遥控器数据解析

  • 移位运算符
  • 遥控器数据获取
  • 遥控器数据解码

RoboMaster遥控器官方例程里面有一个数据解析函数,下面就来为同学们解析数据解析(套娃)。
程序源码如下:

//遥控器数据解析
void RemoteDataProcess(uint8_t *pData)
{RC_CtrlData.rc.ch0 = ((int16_t)pData[0] | ((int16_t)pData[1] << 8)) & 0x07FF; RC_CtrlData.rc.ch1 = (((int16_t)pData[1] >> 3) | ((int16_t)pData[2] << 5)) & 0x07FF;RC_CtrlData.rc.ch2 = (((int16_t)pData[2] >> 6) | ((int16_t)pData[3] << 2) |((int16_t)pData[4] << 10)) & 0x07FF;RC_CtrlData.rc.ch3 = (((int16_t)pData[4] >> 1) | ((int16_t)pData[5]<<7)) & 0x07FF;RC_CtrlData.rc.s1 = ((pData[5] >> 4) & 0x000C) >> 2;RC_CtrlData.rc.s2 = ((pData[5] >> 4) & 0x0003);RC_CtrlData.mouse.x = ((int16_t)pData[6]) | ((int16_t)pData[7] << 8);RC_CtrlData.mouse.y = ((int16_t)pData[8]) | ((int16_t)pData[9] << 8);RC_CtrlData.mouse.z = ((int16_t)pData[10]) | ((int16_t)pData[11] << 8); RC_CtrlData.mouse.press_l = pData[12];RC_CtrlData.mouse.press_r = pData[13];RC_CtrlData.key.v = ((int16_t)pData[14]) | ((int16_t)pData[15] << 8);//your control code ….
}

这段代码来自大疆官方遥控器例程,虽然这里不理解也没关系,对于使用该代码没有影响,但是在这里还是分析一下这段代码的含义。

移位运算符

C语言中,移位运算符是位操作的其中一种。位移运算符有两种:左移(<<)和右移(>>)。下面分别介绍:

左移运算符是将其左侧的运算对象每一位的值左移其右侧运算对象指定的位数。左侧运算对象移出的左侧指舍弃,右侧空出来的位用0补齐。

假设有一个八位数组counter[7],当前存储数据为“10011001”,进行位运算:(10011001)<<3,表示将该数据左移三位.
移位完成:(10011001_ _ _ );
由于数组只能存储8位,所以前三位被舍弃:(11001
_ _ _);
后三位由0补齐:(11001000)。

需要注意的是,该操作产生一个新的值,但不改变其运算对象的值,在上述运算中,counter[7]的值一直都是10011001,不会因为位运算而改变数值,如果想改变其数值,可以使用左移赋值运算符(<<=)。

右移与左移原理相同,此处不再赘述。

遥控器数据获取

RoboMaster遥控器使用 DBUS 接收遥控器的数据,一帧数据的长度为18字节,每字节有8位,一共144位,根据遥控器的说 明书可以查出各段数据的含义,从而进行数据拼接,完成遥控器的解码,从RoboMaster遥控器接收系统用户手册可以查到:

从图片中可以看到,遥控器的三个通道都是11位,但是每个字节只有8位,这个时候就要使用数组拼接。我们设一个8位数组pData;ch0由pData[0]的8位加上pData[1]的后3位组成,ch2由pData[1]的前5位和pData[2]的后6位组成,以此类推。用图片表示为:

我们知道,遥控器上有一个拨轮,设为CH4,那么它的数据接收怎么写?
CH4和CH0一样,是11位。从上面的程序源码可知,前面存储数据用到了pData[15],那么接下来CH4用到的就是pData[16]和pData[17]的后三位,
代码为:

RC_CtrlData.rc.ch4 = ((int16_t)pData[16] | ((int16_t)pData[17] << 8)) &
0x07FF;

遥控器数据解码

以大疆例程里ch0数据解码为例展开讲解:

RC_CtrlData.rc.ch0 = ((int16_t)pData[0] | ((int16_t)pData[1] << 8)) & 0x07FF;

我们假设pData[0]数据为 11001011,pData[1]数据为 10001110,将pData[1]左移8位,作为数据的高八位,对应pData[0]的数据就作为低八位,那么此时数据为 1000111011001011 ,后面的0x7FF转换为2进制是 111 1111 1111,取与操作(&)后结果为 11011001011,即为接收到的数据。

再说一下CH1数据解析:

RC_CtrlData.rc.ch1 = (((int16_t)pData[1] >> 3) | ((int16_t)pData[2] << 5)) & 0x07FF;

同理,我们假设pData[1]数据为 10001110,pData[2]数据为 11000001,将pData[1]右移3位,作为低八位,pData[2]左移5位,作为高八位,那么此时数据为 1100000110001110 ,后面的0x7FF转换为2进制是 111 1111 1111,取与操作(&)后结果为 00110001110,即为接收到的数据(算法和上面一样,就不插图了,太丑了 )。

后面其他的数据处理原理和上述两个大差不差,这里不再赘述。

版权归作者(Alliance战队电控组小昕同学)所有,需要转载或引用请注明来历和作者,若为其他用途或者有其他疑问则联系本文作者。

RoboMaster遥控器数据解析相关推荐

  1. RoboMaster遥控器配置

    遥控器数据处理 串口通信格式 DMA数据处理 遥控器数据处理 中断 在RM比赛中使用的遥控器是DT7,接收机为DR16,使用协议为D_BUS,通信方式为串口通信,同时使用DMA搬运数据. 串口通信: ...

  2. RoboMaster遥控器调参以及左上角拨轮开启教程

    RoboMaster遥控器调参以及左上角拨轮开启教程 1.遥控器驱动以及调参软件安装 2.打开调参软件 3.使用安卓线连接遥控器(遥控器底部的安卓接口)至PC端对遥控器固件进行升级 4.遥控器参数校准 ...

  3. 爬虫之常用数据解析方法

    爬虫之常用数据解析方法

  4. iOS - XML 数据解析

    前言 @interface NSXMLParser : NSObjectpublic class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mark ...

  5. php接口 汉字出错 空,php接口开发时,数据解析失败问题,字符转义,编码问题(示例代码)...

    php接口开发时,数据解析失败问题,字符转义,编码问题 情景: A平台--->向接口请求数据---->接口向B平台请求数据---->B平台返回数据给接口---->接口返回数据给 ...

  6. Android JSON数据解析(GSON方式)

    要创建和解析JSON数据,也可以使用GSON来完成.GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.使用GSON,可以很容易的将一串JSON数据转换为一个Jav ...

  7. Android学习之JSON数据解析

    在Android应用开发中,常用的数据交换格式有XML和JSON,这两种方式各有各的好处,我们在特定的应用开发中可以选择合适的一种.下面来看一下JOSN数据解析: 例子永远是最好的教程,下面我们来看个 ...

  8. 【2020/6/24整理版】利用csi tool获取csi数据并进行数据解析----适合初学的小白

    1.准备工作 <1> 查看自己电脑是否能安装Intel 5300网卡,不能安装的话直接看文章最后,尝试Atheros csi tool工具. <2> 安装Ubuntu系统,cs ...

  9. 歌词数据解析、歌词滚动、歌词进度控制功能的实现(基于js-base64、lyric-parser、better-scroll),以vue项目为例...

    歌词数据解析.歌词滚动.歌词进度控制功能的实现(基于js-base64.lyric-parser.better-scroll) 1.需求分析 后台歌词接口返回的数据如下(base64字符串): W3R ...

最新文章

  1. 测试x86cpu的指令集
  2. 明晰软件架构与数据结构
  3. STM32 C/C++ uCOSII 函数调用return 无法返回或者函数无法正常反回上一层函数的问题
  4. 华为史上最大规模升级!鸿蒙系统进度发布:近百款机型已适配
  5. Ubuntu KDE中 Kaccounts-provider 问题
  6. lynda ux_UX心态
  7. 关于jQuery.query.js 取参数的一个小问题
  8. java 正则判断二进制_regex – 正则表达式,用于定义一些二进制序列
  9. FailSafe双机方案
  10. 线程安全之CAS机制详解(分析详细,通俗易懂)
  11. 【mybatis深度历险系列】mybatis中的动态sql
  12. a20 linux qt,全志A83T开发板,超树莓派/A20/A31S/banana pi M3/八核/Android5
  13. 音频系统POP音的原理和解决方法
  14. VPS云主机是什么?有什么优势?
  15. 大数据———Flume与Kafka整合
  16. 力扣解法汇总2013-检测正方形
  17. 对于IT者的一些有价值的工作建议
  18. 北京/上海内推 | 小红书社区技术部招聘NLP/多模态算法工程师/实习生
  19. KunlunBase集群管理接口
  20. 【socket】socket编程总目录

热门文章

  1. Vmware 占用宿主机硬盘空间只增不减
  2. 外星人电脑切歌快捷键设置
  3. 的it生活_比起最近热议的996,中年IT人的生活才是水深火热
  4. 盘点全球排名前20位的云平台供应商
  5. CAEmitterLayer粒子发射器的神奇效果
  6. 原画?其实模型好看比原画好看重要太多太多
  7. matlab如何读su文件下载,su二进制文件
  8. layui 复杂表头多层表头的表格数据非后台导出excel
  9. win10系统常用的几种截图方式
  10. JAVA数据库连接(JDBS)