【分享帖】小白数据处理---裁判系统数据读取
![张富春](https://hz-rm-bbs-web-prod.oss-cn-hangzhou.aliyuncs.com/avatar/pre/v1/000026964_avatar_big.jpg)
[postbg]bg10.png[/postbg]都说最好的学习方式就是,学着当一个老师讲出来,当你能给别人讲出来,自己也就没问题了
所以呢。。。今天突然就想发一篇帖子,主要聊聊裁判系统数据处理的一些问题
(非常适合小白来学习{:2_31:})。
半年之前就了解过裁判系统,也尝试过过处理裁判系统发来的数据,但是都没有做到最后:L。
最近打别的比赛,调试激光雷达的时候,也遇到了数据处理的问题,所以就拿出来一点时间,把遗留的问题解决一下。
今天整理的两种处理方式,希望对大家有帮助{:2_27:}。
再进入正题之前呢,先对一些基础知识做一个普及{:3_52:}。
共用体(联合体):
[attach]24540[/attach]
先介绍定义,之后用到再细细解释。
memcpy函数:
memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。
下面就是正题啦,一个是利用共用体的方式,一个是利用
共用体方式:
typedef union
{
uint8_t U[4];
float F;
}FormatTrans;
这样一个共用体,当给FormatTrans.U 赋值时,FormatTrans.F的值也在变化。
[attach]24542[/attach]
在这里举一个例子,但这样的处理方式似乎会出现一些小的问题,我们主要说第二种方法。
有道云笔记链接:http://note.youdao.com/noteshare?id=f64638b3d3aaa0ec75a461dd6fa7c9d1&sub=0798968BB8A04ED3BE6940B57D013328
笔记内容之后会持续更新更加完善。
[attach]24543[/attach]
现在我们对这一段代码逐句解读
本人也是很菜的小白,这只是个人的理解,有其他见解或者这篇帖子有什么问题的地方,请指教{:3_60:}。
所以呢。。。今天突然就想发一篇帖子,主要聊聊裁判系统数据处理的一些问题
(非常适合小白来学习{:2_31:})。
半年之前就了解过裁判系统,也尝试过过处理裁判系统发来的数据,但是都没有做到最后:L。
最近打别的比赛,调试激光雷达的时候,也遇到了数据处理的问题,所以就拿出来一点时间,把遗留的问题解决一下。
今天整理的两种处理方式,希望对大家有帮助{:2_27:}。
再进入正题之前呢,先对一些基础知识做一个普及{:3_52:}。
共用体(联合体):
[attach]24540[/attach]
先介绍定义,之后用到再细细解释。
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的值也在变化。
[attach]24542[/attach]
在这里举一个例子,但这样的处理方式似乎会出现一些小的问题,我们主要说第二种方法。
利用
memcpy函数的方法:
有道云笔记链接:http://note.youdao.com/noteshare?id=f64638b3d3aaa0ec75a461dd6fa7c9d1&sub=0798968BB8A04ED3BE6940B57D013328
笔记内容之后会持续更新更加完善。
[attach]24543[/attach]
现在我们对这一段代码逐句解读
/**
*@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;
}
//这里就很简单了,不加解释
本人也是很菜的小白,这只是个人的理解,有其他见解或者这篇帖子有什么问题的地方,请指教{:3_60:}。
请问这篇文章对你有用吗?
【分享帖】小白数据处理---裁判系统数据读取