wheel_legged/modules/master_machine/湖南大学RoboMaster电控组通信协议.md

73 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 湖南大学RoboMaster电控组通信协议
<p align='right'>Seasky LIUWei</p>
<p align='right'>modified by neozng1@hnu.edu.cn</p>
可用于视觉,以及其他自研模块(仅限串口通信)
> TODO:
>
> 1. 利用F4自带的硬件CRC模块计算校验码提高速度
> 2. 增加更多的数据类型支持,使得数据类型也为可配置的
## 一、串口配置
通信方式是串口,配置为波特率 9216008 位数据位1 位停止位,无硬件流控,无校验位。
## 二、数据帧说明
以下所有低位在前发送,数据长度可变。
1. 通信协议格式
| 帧头 | 数据ID | 数据 | 帧尾 |
| ----------------------- | -------------- | ------------- | :---------------------------------- |
| protocol_header(4-byte) | cmd_id(2-byte) | data (n-byte) | frame_tail(2-byteCRC16整包校验) |
2. 帧头详细定义
| 帧头 | 偏移位置 | 字节大小 | 内容 |
| ----------- | -------- | -------- | ----------------------------- |
| sof(CMD) | 0 | 1 | 数据帧起始字节,固定值为 0xA5 |
| data_length | 1 | 2 | 数据帧中 data 的长度 |
| crc_check | 3 | 1 | 帧头CRC校验 |
3. cmd_id 命令码 ID 说明 **(字节偏移 4字节大小 2)**
| 命令码 | 数据段长度 | 功能说明 |
| -------------- | --------------- | -------- |
| 0x0001(可修改) | 2 byte (16-bit) | 视觉数据 |
| ....... | | |
4. 数据段data (n-byte)
| 数据 | 偏移位置 | 字节大小 | 内容 |
| -------------- | -------- | --------------- | ------------------------------------- |
| flags_register | 6 | 2 | 16位标志置位寄存器 |
| float_data | 8 | 4 * data_length | float数据内容4 * data_length-byte |
5. frame_tail(CRC16整包校验)
## 三、协议接口说明
```c
/*更新发送数据帧,并计算发送数据帧长度*/
void get_protocol_send_data(uint16_t send_id, //信号id
uint16_t flags_register, // 16位寄存器
float *tx_data, //待发送的float数据
uint8_t float_length, // float的数据长度
uint8_t *tx_buf, //待发送的数据帧
uint16_t *tx_buf_len); //待发送的数据帧长度
```
将float_data字段准备好放入`tx_data[]`并设置好标志位`flags_register`之后,调用此函数。它将计算循环冗余校验码,并把数据转换成串口发送的格式,放在`tx_buf[]`中。
```c
/*接收数据处理*/
uint16_t get_protocol_info(uint8_t *rx_buf, //接收到的原始数据
uint16_t *flags_register, //接收数据的16位寄存器地址
float *rx_data); //接收的float数据存储地址
```
将收到的一包原始数据buff地址传入若校验通过会把收到的标志位和float数据解析出来保存在`flags_register*`和 `rx_data[]`中。