Files
IRIS_Communication_Protocol/Readme.md
2024-07-10 17:21:16 +08:00

180 lines
4.2 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.

# IRIS通讯协议 V1.0
### 帧格式:
| 帧头 | 命令类型 | 长度 | Data | Check |
| :-------: | :-----------: | :----: | :--: | :-----------: |
| 0x55 0xAA | Command 1字节 | 两字节 | Data | crc校验 2字节 |
- **帧头**固定的0x55 0xAA 两个字节
- **命令类型**:一个字节
- 0x01: 命令为字符串 即Data要转换为字符串
- 0x00: 命令为json数据应用json解析Data
- 0x02-0xff:自定义二进制通讯数据Data的解析应改按照Communication_Protocol中约定进行
- **长度**Data的长度
- **Check**:Data的 CRC校验 算法在Communication_Protocol提供了如果Data过长光谱数据可以不计算但是得提供此时提供内容为0xEE 0xEE
- **均采用小端方式存储**
### json 定义
json定义比较灵活 但是根对象必须提供如下:
- command: 命令名称
- PA:命令参数 //可选
返回时应提供相应状态
- STOK //可选
发送示例:
```json
{
"command":"SetCamerTime",
"PA":{
"time1":1000,
"time2":1000
},
"Other":"自己定义"
}
```
接收示例
```json
{
"command":"SetCamerTime",
"Other":"自己定义",
"ST":"OK"
}
```
### Communication_Protocol.h及.c
该文件主要定义了命令的名称 以#define方式进行。并且在末尾提供了一些通用函数 如下
```c
#ifndef COMMUNICATION_PROTOCOL_H
#define COMMUNICATION_PROTOCOL_H
#include <stdint.h>
#include <Communication_struct.h>
// DEFINE The protocol Here
//Forexample
// #define MYCOMAN 0x02 //命令全大写
// todo : define your protocol here
/*-------------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------------*/
/*
在此之下开始定义一些函数
*/
#define ERROR_NOT_ENOUGH_DATA -200
#define ERROR_HEADER -300
#define ERROR_COMMAND -400
#define ERROR_INPUT -500
#define ERROR_CRC -600
// 成功返回打包后的数据长度
// -1: Error
// 成功返回打包后的数据长度
int32_t IRIS_Protocol_Pack(uint8_t Command,uint16_t LenthofIn, uint8_t *BufferIn, uint8_t *PackData);
// 解包函数 PackData 是接收到的数据 LenthofIn 是数据长度 Command 是命令 BufferOut 是输出
// 下位机使用的打包函数 Command 是输出
// 成功返回解包后的数据长度
// 0: 该命令返回无参数
// 错误返回ERRor
// 成功返回解包后的数据长度
int32_t IRIS_STM32_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t *Command, uint8_t *BufferOut);
// 解包函数 PackData 是接收到的数据 LenthofIn 是数据长度 Command 是命令输入 BufferOut 是输出 上位机使用
// 成功返回解包后的数据长度
// 0: 该命令返回无参数
// 错误返回ERRor
// 成功返回解包后的数据长度
int32_t IRIS_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t Command, uint8_t *BufferOut);
// 定义裁切命令
// 成功返回裁切后的数据长度
// -1: Error
int32_t IRIS_Cut_Befor_Header(uint8_t *PackData, uint16_t LenthofIn );
// 检查数据是否有效
// 有效返回值1
// 错误返回ERRor
int32_t IRIS_Check_Data_Valid(uint8_t *PackData, uint16_t LenthofIn );
// 返回CRC校验值
uint16_t IRIS_calcCRC(const void *pBuffer, uint16_t bufferSize);
#endif
```
### Communication_struct.h
该文件主要定义了命令相关参数部分的定义 所有参数都应该以结构体定义 无需参数的不定义 具体如下
```c
#ifndef COMMUNICATION_STRUCT_H
#define COMMUNICATION_STRUCT_H
// Define your communication structures here
// For example:
/*
如果发送和接受的数据结构一样,那么就定义一个结构体
struct MyComan_struct //对应的命令结构体 小驼峰命名法+struct
{
uint8_t Command;
uint16_t LenthofIn;
};
如果发送和接受的数据结构不一样,那么就分开定义
struct MyComan_Send_struct //对应的命令结构体 小驼峰命名法+Send_struct
{
uint8_t Command;
uint16_t LenthofIn;
};
struct MyComan_Recv_struct //对应的命令结构体 小驼峰命名法+Recv_struct
{
uint8_t Command;
uint16_t LenthofOut;
};
*/
#endif // COMMUNICATION_STRUCT_H
```