楼主

[嵌入式] 【分享帖】小白数据处理---裁判系统数据读取

[复制链接]
英雄张富春
2019-7-28 14:51:28 只看该作者

马上注册,玩转Robomaster!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
都说最好的学习方式就是,学着当一个老师讲出来,当你能给别人讲出来,自己也就没问题了
所以呢。。。今天突然就想发一篇帖子,主要聊聊裁判系统数据处理的一些问题
(非常适合小白来学习)。


半年之前就了解过裁判系统,也尝试过过处理裁判系统发来的数据,但是都没有做到最后
最近打别的比赛,调试激光雷达的时候,也遇到了数据处理的问题,所以就拿出来一点时间,把遗留的问题解决一下。
今天整理的两种处理方式,希望对大家有帮助


再进入正题之前呢,先对一些基础知识做一个普及


共用体(联合体):

先介绍定义,之后用到再细细解释。

CRC校验:这个大家可以上网上仔细学习,然后再回来给本宝宝讲讲

个人的理解就是:在要发送的帧后面附加一个数

这个数要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)

这里我看了好几遍也没咋懂,大概就是按照一个公式得到的固定的一批数

这里大疆没给出公式,而是直接把数组列了出来



memcpy函数:
memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。



下面就是正题啦,一个是利用共用体的方式,一个是利用
memcpy函数的方法。



共用体方式:

typedef union
{
    uint8_t U[4];
    float F;
}FormatTrans;


这样一个共用体,当给FormatTrans.U 赋值时,FormatTrans.F的值也在变化。


在这里举一个例子,但这样的处理方式似乎会出现一些小的问题,我们主要说第二种方法。

利用
memcpy函数的方法:

有道云笔记链接:http://note.youdao.com/noteshare?id=f64638b3d3aaa0ec75a461dd6fa7c9d1&sub=0798968BB8A04ED3BE6940B57D013328
笔记内容之后会持续更新更加完善。


现在我们对这一段代码逐句解读
/**

  *@brief               将一个字符串数据复制到一块内存。

  *@param[in]            存入的位置

  *@param[in]            要存入的地址

  *@param[in]            长度(字节)这里为5

  */  

memcpy(&JudgementData.frameHeader, &JudgeDataBuffer[start_pos],FrameHeader_Len);


if((JudgementData.frameHeader.SOF==(uint16_t)JudgeFrameHeader) \   

//判断是不是0xA5

    &&(1==Verify_CRC8_Check_Sum(&JudgeDataBuffer[start_pos],FrameHeader_Len)) \

//CRC8校验   仔细进去看就能看明白

    &&(1==Verify_CRC16_Check_Sum(&JudgeDataBuffer[start_pos],

JudgementData.frameHeader.DataLenth+FrameHeader_Len+4)))

//CRC16校验

//数据位长度+帧头长度+命令码长度+校验码长度

//if成立,我们则认为这帧数据可信

memcpy(&JudgementData.rxCmdId, (&JudgeDataBuffer[start_pos]+5), sizeof(JudgementData.rxCmdId));

//sizeof 获取此帧数据字节数

// (&JudgeDataBuffer[start_pos]+5),  去掉起始帧第5位的地址

JudgeDataBuffer[start_pos]++;//每处理完一次就在帧头加一防止再次处理这帧数据

next_start_pos=start_pos+9+JudgementData.frameHeader.DataLenth;

//9为 5位帧头 2位数据长度 2校验位

一帧数据:5字节帧头FrameHeader + 2个字节命令码ID CmdID + n个字节数据Data + 2个字节的CRC校验CRC16

        switch(JudgementData.rxCmdId)

                        {

                                case Robot_Status_ID://读取机器人等级血量等

                                {

                                        memcpy(&JudgementData.game_robot_state_t,(&JudgeDataBuffer[start_pos]+7),JudgementData.frameHeader.DataLenth);                                        //把数组中的数据复制到对应的结构体中去

                                }

                                break;

                                case power_heat_data_ID://读取机器人枪口热量

                                {

                                        memcpy(&JudgementData.power_heat_data_t,(&JudgeDataBuffer[start_pos]+7),JudgementData.frameHeader.DataLenth);                                       //把数组中的数据复制到对应的结构体中去

                                }        

                                break;

                                case shoot_data_ID://读取机器人射频射速

                                {

                                        memcpy(&JudgementData.shoot_data_t,(&JudgeDataBuffer[start_pos]+7),JudgementData.frameHeader.DataLenth);                                       //把数组中的数据复制到对应的结构体中去                        

                                }               

                                break;

                                case robot_hurt_ID://读取机器人射频射速

                                {

                                        memcpy(&JudgementData.robot_hurt_t,(&JudgeDataBuffer[start_pos]+7),JudgementData.frameHeader.DataLenth);//把数组中的数据复制到对应的结构体中去                        

                                }               

                                break;

                        }

//这里就很简单了,不加解释

本人也是很菜的小白,这只是个人的理解,有其他见解或者这篇帖子有什么问题的地方,请指教




跳转到指定楼层
推荐

[嵌入式] 【分享帖】小白数据处理---裁判系统数据读取

[复制链接]
梯队队员Jessy_Y
2020-2-20 12:22:35 只看该作者
楼主 求代码~
回复 支持 0 反对 1

使用道具 举报

推荐

[嵌入式] 【分享帖】小白数据处理---裁判系统数据读取

[复制链接]
步兵VincentN0.1
2020-2-17 20:03:45 只看该作者
联合体这个也可以,不过有一个坑,就是内存对齐方式
联合体的话需要将该结构体的内存对齐方式设置成1字节对齐
还有,memcpy貌似会占用比较多的时间
推荐

[嵌入式] 【分享帖】小白数据处理---裁判系统数据读取

[复制链接]
英雄张富春
 楼主| 2019-9-13 16:59:45 只看该作者
ccccj 发表于 2019-9-13 12:32
有没有全一点的代码

有的,需要的话可以加好友私发给你
沙发

[嵌入式] 【分享帖】小白数据处理---裁判系统数据读取

[复制链接]
英雄张富春
 楼主| 2019-7-28 14:52:25 只看该作者
我的图片又被吃了??
板凳

[嵌入式] 【分享帖】小白数据处理---裁判系统数据读取

[复制链接]
英雄张富春
 楼主| 2019-7-28 14:52:45 只看该作者
请问怎样才能完好保存图片啊,呜呜呜
地板

[嵌入式] 【分享帖】小白数据处理---裁判系统数据读取

[复制链接]
梯队队员ccccj
2019-9-13 12:18:12 只看该作者
楼主,代码是大疆给的代码么
5#

[嵌入式] 【分享帖】小白数据处理---裁判系统数据读取

[复制链接]
梯队队员ccccj
2019-9-13 12:32:12 只看该作者
有没有全一点的代码
6#

[嵌入式] 【分享帖】小白数据处理---裁判系统数据读取

[复制链接]
英雄张富春
 楼主| 2019-9-13 16:59:20 只看该作者
ccccj 发表于 2019-9-13 12:18
楼主,代码是大疆给的代码么

不是的,大疆没给出代码呢
8#

[嵌入式] 【分享帖】小白数据处理---裁判系统数据读取

[复制链接]
梯队队员ccccj
2019-9-18 13:45:18 只看该作者
张富春 发表于 2019-9-13 16:59
有的,需要的话可以加好友私发给你

加好友了
9#

[嵌入式] 【分享帖】小白数据处理---裁判系统数据读取

[复制链接]
正式队员南西南
2019-11-8 17:44:59 只看该作者
楼主楼主求代码!!
10#

[嵌入式] 【分享帖】小白数据处理---裁判系统数据读取

[复制链接]
顾问You蓝
2019-11-8 20:17:19 只看该作者
不懂帮顶系列
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

触屏版 | 电脑版

Copyright © 2024 RoboMasters 版权所有 备案号 粤ICP备2022092332号

快速回复 返回顶部 返回列表