我是靠谱客的博主 娇气小松鼠,最近开发中收集的这篇文章主要介绍ROBOMASTER裁判系统数据交互,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

写在前面

战队之前这部分代码写的很乱,不利于新队员学习和添加内容,所以整理了一下相关内容,主要介绍串口协议数据帧的格式,并创建结构体用于管理交互数据,初学者结合官方文档可以更快的理清头绪。

机器人间交互数据结构体

请添加图片描述

串口通信协议格式

基于裁判系统的数据交互帧格式需要严格遵守一下格式,其中cmd_id用于说明该协议的功能,data(n-byte)包含自定义,除去数据段外共9个字节。

frame_headercmd_id (2-byte)data (n-byte)frame_tail
(5-byte)(2-byte)(n-byte)(2-byte,CRC16,整包校验)
  • frame_header 格式
位域偏移位置大小(字节)详细描述
SOF01数据帧起始字节,固定值为 0xA5
data_length12数据帧中 data 的长度
seq31包序号
CRC841帧头前四个字节进行CRC8 校验
typedef struct
{
	uint8_t SOF;           //固定为0xA5
	uint16_t data_length;  //data字节数
	uint8_t seq;		   //包序号
	uint8_t CRC8;
}fram_head;
  • cmd_id命令码说明

以下命令码都是用于由主控板或者上位机向裁判系统用户串口发送数据的id,可用于战队的二次开发。

命令码数据段长度功能说明
0x0301n机器人间交互数据,发送方触发发送,上限 10Hz
0x0302n自定义控制器交互数据接口,通过客户端触发发送,上限 30Hz
0x030315客户端小地图交互数据,触发发送
0x030412键盘、鼠标信息,通过图传串口发送
0x030510客户端小地图接收信息
  • data (n-byte)数据段内容根据cmd_id命令码的种类而变化,对应的frame_tail部分为两个字节的CRC16校验。

绘制UI频繁调用的结构体

交互数据接收信息:student_interactive_header_data_t

交互帧的数据段***(data (n-byte))*** 包括一个统一的数据段头结构。数据段包含了内容 ID,发送者以及接收者的 ID 和内容数据段,以下为该结构,共六个字节;在UI的绘制中,sender_ID为客户端ID,receiver_ID为机器人ID。

//< robots' & clients' ID的宏定义
#define RobotRedHero 1
#define RobotRedEngineer 2
#define RobotRedInfantryNO3 3
#define RobotRedInfantryNO4 4
#define RobotRedInfantryNO5 5
#define RobotRedAerial 6
#define RobotRedSentry 7
#define RobotRedRadar 9

#define ClientRedHero 0x0101
#define ClientRedEngineer 0x0102
#define ClientRedInfantryNO3 0x0103
#define ClientRedInfantryNO4 0x0104
#define ClientRedInfantryNO5 0x0105
#define ClientRedAerial 0x0106

//< 具体的结构体
typedef __packed struct
{
 uint16_t data_cmd_id;
 uint16_t sender_ID;
 uint16_t receiver_ID;
}ext_student_interactive_header_data_t;

图形数据结构体:graphic_data_struct_t

该结构体是绘制UI的基础图形结构体,经常作为交互帧的数据段***(data (n-byte))***中的一部分,共有 3 + 4 + 4 = 15 个字节,其结构应当被熟悉记忆。

typedef __packed struct
{ 
uint8_t graphic_name[3]; 
uint32_t operate_tpye:3; 
uint32_t graphic_tpye:3; 
uint32_t layer:4; 
uint32_t color:4; 
uint32_t start_angle:9;
uint32_t end_angle:9;
uint32_t width:10; 
uint32_t start_x:11; 
uint32_t start_y:11; 
uint32_t radius:10; 
uint32_t end_x:11; 
uint32_t end_y:11; 
} graphic_data_struct_t
代码变量字节偏移量大小说明备注
graphic_name[3];03Byte图形名在删除,修改等操作中,作为客户端的索引。
operate_tpye:3;34Byte (3bit)图形配置 1bit 0-2:图形操作:0:空操作;1:增加;2:修改;3:删除;
graphic_tpye:3;3bitBit 3-5:图形类型:0:直线;1:矩形;2:整圆;3:椭圆;4:圆弧;5:浮点数;6:整型数;7:字符;
layer:4;4bitBit 6-9:图层数,0~9;
color:4;4bitBit 10-13:颜色:0:红蓝主色;1:黄色;2:绿色;4:紫红色等等;
start_angle:9;9bitBit 14-22:起始角度,单位:°,范围[0,360];
end_angle:9;9bitBit 23-31:终止角度,单位:°,范围[0,360]。
width:10;74Byte (10bit)图形配置 2Bit 0-9:线宽;
start_x:11;11bitBit 10-20:起点 x 坐标
start_y:11;11bitBit 21-31:起点 y 坐标。
radius:10;114Byte (10bit)图形配置 3Bit 0-9:字体大小或者半径;
end_x:11;(11bit)Bit 10-20:终点 x 坐标;
end_y:11;(11bit)Bit 21-31:终点 y 坐标。

图形配置详见下表,其中空代表该字段的数据对该图形无影响,推荐字体大小与线宽比例为 10:1

请添加图片描述

客户端绘制字符结构体: client_custom_character_t

typedef __packed struct
{
	graphic_data_struct_t grapic_data_struct;
	uint8_t data[30];
} ext_client_custom_character_t;

绘制字符或者数字的完整数据帧包含五个部分

  • frame_header(5-byte)
  • cmd_id (2-byte)
  • student_interactive_header_data_t (6-byte)
  • ext_client_custom_character_t (45-byte)
  • frame_tail (2-byte,CRC16)
    结合这五个部分,我设计了一个包含完整数据交互帧的结构体用于绘制字符UI,只需要调用程序修改该结构体的值然后通过串口发送该结构体就可以实现自定义UI的功能:
/*
 * UI绘制字符的完整结构体,共60个字节,由
 */
typedef __packed struct
{ 
	//<frame_header(5-byte) 帧头部分
	frame_header_t frame_header;   
	
	//< cmd_id(2-byte) 命令码
	uint16_t cmd_id;
	
	//< data(51-byte)
	ext_student_interactive_header_data_t ext_student_interactive_header_data;  //< 数据段头结构,共6个字节
	graphic_data_struct_t grapic_data_struct;			//< 共15个字节
	uint8_t data[30];															//< 共30个字节,直接将字符串char* 使用 strcpy 复制进该区域
	
	//< frame_tail(2-byte,CRC16,整包校验)
	uint8_t CRC16[2];
} ext_client_custom_character_t;   

最后

以上就是娇气小松鼠为你收集整理的ROBOMASTER裁判系统数据交互的全部内容,希望文章能够帮你解决ROBOMASTER裁判系统数据交互所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部