# 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:命令参数 //可选 返回时应提供相应状态 - ST:OK //可选 发送示例: ```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 #include // 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 ```