RoboMaster

标题: 【通知帖】裁判系统用户数据读取 [打印本页]

作者: robomasters    时间: 2018-2-11 11:44
标题: 【通知帖】裁判系统用户数据读取
用户数据协议说明
裁判系统的学生接口外发的数据一帧分为 4 个部分,分别是帧头数据、命令码 ID、数据、帧尾校验数据。

1、帧头数据

/**
  * @brief  frame header structure definition
  */
typedef __packed struct
{
  uint8_t  sof;
  uint16_t data_length;
  uint8_t  seq;
  uint8_t  crc8;
} frame_header_t;

帧头数据
占用字节
详细描述
sof1数据的域ID,学生接口域:0xA5
data_length2每帧内数据data的长度
seq1包序号
crc81帧头的crc校验结果

2、命令码
一个命令码对应一帧包含具体信息的数据。
命令码
占用字节
cmdid2

3、数据
为命令码 ID 对应的数据结构,数据长度即这个结构体的大小。
数据
占用字节
datadata_length

4、帧尾数据
每帧数据的crc16校验结果存储在这个位置。
帧尾数据
占用字节
crc162

数据发送和接收

1、数据发送
数据发送部分比较简单,数据打包好后,其实就是正常的数据加上了帧头帧尾和校验数据,这个时候我们只需要把打包好的数据的数组直接通过串口发送出去即可。不管是使用串口进行普通的移位发送,还是使用 DMA 发送,都可以很容易的实现。
使用如下函数打包要发送的数据:

/**
  * @brief     pack data to bottom device
  * @param[in] cmd_id:  command id of data
  * @param[in] *p_data: pointer to the data to be sent
  * @param[in] len:     the data length
  */
void data_pack_handle(uint16_t cmd_id, uint8_t *p_data, uint16_t len)
{
  memset(computer_tx_buf, 0, COMPUTER_FRAME_BUFLEN);
  frame_header_t *p_header = (frame_header_t*)computer_tx_buf;
  
  p_header->sof          = UP_REG_ID;
  p_header->data_length  = len;
  
  memcpy(&computer_tx_buf[HEADER_LEN], (uint8_t*)&cmd_id, CMD_LEN);
  append_crc8_check_sum(computer_tx_buf, HEADER_LEN);
  
  memcpy(&computer_tx_buf[HEADER_LEN + CMD_LEN], p_data, len);
  append_crc16_check_sum(computer_tx_buf, HEADER_LEN + CMD_LEN + len + CRC_LEN);
}

2、数据接收
裁判系统的数据发送出来时不同的帧数据长度是不定的,而且可能会有连续帧或者断帧的情况出现,这个时候使用接收遥控器数据的方法来接收就会出现问题。下面给大家提供接收裁判系统数据的具体思路,主要包含串口不定长数据的接收,以及接收到的数据的存储和解析。

2.1 串口不定长数据接收
首先解决不定长数据的问题,因为数据不定长度,所以不能只靠一个固定长度的缓冲和空闲中断来接收数据,缓冲可能有溢出的情况,而且单片机的资源有限,也不可能使用很大的内存空间一次性接收完每次裁判系统发送过来的数据。
使用串口空闲中断,加 DMA 满中断来接收和存储串口数据。下面是两种中断配合使用时的具体情况:

使用空闲中断处理数据的时候需要注意,要记录此时 DMA 缓冲中的数据位数,然后作为缓冲的读写指针,下一次 DMA 满中断或者空闲中断时从这个位置开始读取。

2.2 数据储存
裁判系统的有些数据是固定频率发送的,但有些是随机发送的,比如伤害信息这种类型的数据,装甲受到打击后才会发送,而且只发送一次。为了防止有漏接的数据,可以使用队列来储存串口接收到的原始数据。
这个队列是存储串口接收数据的,可以自己实现队列的数据结构,如果是带操作系统的话,也可以使用其中自带的队列结构 api。需要注意的是进行队列读写操作时,队列为空或者满时尽量直接返回,不要阻塞程序。

2.3 数据解析

按照裁判系统的协议格式,如果要解析出有效数据,我们就需要在存储数据的队列中从帧头开始,分别通过帧头、命令码和数据长度、CRC8,以及最终的 CRC16 这些校验之后,才能认为这帧数据是有效的,也就解析出了有效的裁判系统数据。

3、示例代码

在 robomaster 的官方 GitHub 中,有开源的 ICRA 比赛使用的步兵固件,大家可以参考其中的一些代码来实现对裁判系统的数据接收。RoboRTS-Firmware 地址是:https://github.com/RoboMaster/RoboRTS-Firmware
下面是具体功能实现的位置:
串口配置:https://github.com/RoboMaster/RoboRTS-Firmware/blob/master/MDK-ARM/bsp/bsp_uart.c
数据存储结构:https://github.com/RoboMaster/RoboRTS-Firmware/blob/master/MDK-ARM/other_lib/data_fifo.c
数据解析:https://github.com/RoboMaster/RoboRTS-Firmware/blob/master/MDK-ARM/rmlib/communicate.c


作者: Extreme    时间: 2018-2-11 14:11
罗老师牛匹
作者: 下午茶    时间: 2018-2-11 16:35
点赞~~~~
作者: SKDZZC    时间: 2018-2-27 17:04
源程序看的一脸懵逼
作者: llh6833    时间: 2018-2-28 17:06
赞一个
作者: aaa1234zzz    时间: 2018-3-1 15:47
赞赞赞赞
作者: 苏一休    时间: 2018-3-1 16:15
现在这个2.0.3.33的固件传输的帧还是会断帧,发一点然后过一会儿才发剩下的,然后这样就会导致进入空闲中断然后CRC就校验不过,所以还是很蛋疼的,坐等新固件
作者: Yez    时间: 2018-3-1 23:44
苏一休 发表于 2018-3-1 16:15
现在这个2.0.3.33的固件传输的帧还是会断帧,发一点然后过一会儿才发剩下的,然后这样就会导致进入空闲中断 ...

一休哥牛逼
作者: qq545031318    时间: 2018-3-2 21:35
限制了工程机器人与英雄机器人同时抓取弹药箱的数量
作者: 15766115769    时间: 2018-3-2 22:19
限制了工程机器人与英雄机器人同时抓取弹药箱的数量
作者: LUNLUN    时间: 2018-3-11 12:01
源程序有点懵 啊  看了好多篇,就是不知道 他的任务好像没有从DMA缓存中获取数据  不知道是咋回事  也不知道他的获取数据的代码哪个角落啊

作者: toxgg    时间: 2018-3-14 21:13
一脸懵逼啊
作者: toxgg    时间: 2018-3-15 00:07
只接主控的情况下,主控灯是黄色的,是否能正常进行裁判系统的数据读取
作者: HHHHHH    时间: 2018-3-19 10:20
苏一休 发表于 2018-3-1 16:15
现在这个2.0.3.33的固件传输的帧还是会断帧,发一点然后过一会儿才发剩下的,然后这样就会导致进入空闲中断 ...

大佬裁判系统如何用DMA读取,官方的看不懂呀
作者: 哲理俊    时间: 2018-3-20 14:00
1、为什么空闲中断还会出现缓冲溢出的情况呢?我预先给一个大一点的缓冲比如100,理论上是可以接收到每一帧数据的呀

2、还有就是DMA满中断的必要性我也不是很理解,空闲中断不是每次都重置了DMA了吗,为什么DMA还会满?

求大神解答
作者: 张文杨    时间: 2018-3-21 01:37
电流电压值解出来好大啊
作者: 张文杨    时间: 2018-3-21 08:41
为啥接收的电压值的4个字节一移位那么大
作者: 张文杨    时间: 2018-3-21 12:51
为什么裁判系统数据移位之后数据变得那么大呢
作者: HZR    时间: 2018-3-26 19:26
Extreme 发表于 2018-2-11 14:11
罗老师牛匹

这个代码是可以直接用的吗,用不用改的
作者: buli    时间: 2018-3-29 17:05
哲理俊 发表于 2018-3-20 14:00
1、为什么空闲中断还会出现缓冲溢出的情况呢?我预先给一个大一点的缓冲比如100,理论上是可以接收到每一帧 ...

1、裁判系统发出的数据有的不是定频的,有可能有好几帧数据粘在一起的情况,缓冲设置的再长都会超,不能依靠一个很长的缓冲一次接完完整的数据;
2、dma满中断确实没什么必要,最新的代码里面好像已经去掉了,不过空闲中断重置DMA是什么?,你看的是遥控器接收数据的处理吧
作者: 1500nameless    时间: 2018-3-29 20:12
6666666666666666666666666
作者: thranduilcmd    时间: 2018-3-30 15:47
666666666666
作者: 19990818    时间: 2018-4-1 23:20
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
作者: gansujingtai    时间: 2018-4-9 17:14
本帖最后由 gansujingtai 于 2018-4-9 17:18 编辑

自己用串口空闲中断+DMA读取裁判系统的数据,发现总是丢两包数据
C:\Users\shanglunshen\Desktop\新建文件夹
作者: delay    时间: 2018-5-22 10:52
点赞。。。。
作者: delay    时间: 2018-5-22 11:20
6666          65
作者: yudada666    时间: 2018-5-29 12:58
限制了工程机器人与英雄机器人同时抓取弹药箱的数量
作者: lowbulow    时间: 2018-6-23 14:05
666666666666666666666666666666666666
作者: 时光淡忘了记忆    时间: 2018-8-3 20:07
赞赞赞赞
作者: 951488363    时间: 2018-8-22 08:47
6666666666666666666666666
作者: 任豪杰    时间: 2018-9-6 10:25
66666666666666666666666666
作者: 彧或或    时间: 2018-9-6 20:38
赞 赞 赞
作者: 廖小凤    时间: 2018-11-3 18:23
hhhhhhhhhhhhhhhhhhhhhh
作者: 成工机电    时间: 2018-11-3 19:32
让我刚打完广东省分行干活
作者: 李鑫磊    时间: 2018-11-4 06:41
裁判系统发出的数据有的不是定频的,有可能有好几帧数据粘在一起的情况,缓冲设置的再长都会超
作者: lsy    时间: 2018-11-7 19:38
厉害学到了
作者: Flumine    时间: 2019-2-18 19:16
厉害厉害厉害
作者: jokerlalala    时间: 2019-3-7 15:58
学习了!!
作者: 龙小越    时间: 2019-3-7 16:38
“下面是具体功能实现的位置:”这里的链接打不开了
作者: Phoenicurus.    时间: 2019-3-7 21:20
点赞~~~~~·
作者: kkkk_1    时间: 2019-4-14 14:32
除了第一个,其余都404了
作者: 高悦波    时间: 2019-4-16 14:24
下面那些链接怎么打不开?
作者: 赵建强111    时间: 2019-10-7 07:52
感谢大佬的开源,希望RM参赛队可以越来越好
作者: Chadwick    时间: 2019-12-1 11:07
github链接打不开 都404了
作者: hui    时间: 2019-12-2 20:28
赞赞赞赞
作者: 崎百川    时间: 2020-11-19 20:59
除了第一个,其余都404了
作者: 华师电控小白    时间: 2020-11-29 15:50
太赞了!




欢迎光临 RoboMaster (https://bbs.robomaster.com/) Powered by Discuz! X3.2