目的:应用于各仪器的各个模块软件之间的交互。
支持串口、网络通信和CAN总线通信
包格式定义如表:
start1 | Start2 | Config | lenth | 帧号 | 加密明key | ID | ID | 包类型 | CMD | Data | crc |
0x69 | 0xAA | 从源ID开始 | 0~4Byte | 源ID | 目标ID | 命令 | 数据 | crc校验 |
1.起始位为固定的两个Byte:0x69AA;
2.Lenth为从加密明Key到crc检验位的数据包长度,以Byte为单位,包括Key但不包含crc位,最短为1Byte,最大4Byte,串口通信建议使用1Byte;
3.帧号:0x01-0xFF循环使用,重发帧号相同。
4.加密明key:该数据为可变字段,根据系统和帧号形成加密明key,与系统固定密匙对从包类型到CRC(不包括CRC)的数据进行加密,具体加密方式详见加密指导规则。
5.源ID:源ID为发送模块的ID,0x01~0xFF;
6.目标ID:源ID为接收模块的ID,0x01~0xFF;
7.包类型:包类型定义如表:
编码 | 包类型 |
0x01 | 命令包帧 |
0x02 | 数据包帧 |
0x03 | 错误帧 |
0x04 | 状态帧 |
0x05 | 应答帧 |
其他预留,可自定义 |
8.CMD:为命令字,代表该ID模块的发送的命令、状态的代号,接收模块通过该命令字可以知道该命令是否属于自身要进行执行或是忽略的命令。
9.Data:为数据段,为数据包携带的数据;
数据(Data)格式定义如表:数据包格式
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ... |
类型 | 数据总长度 | 数据起始位置 | 数据长度 |
数据(Data)中的数据类型定义为:
编码 | 数据类型 |
0x01 | char |
0x02 | Unsigned char |
0x03 | short |
0x04 | Unsigned short |
0x05 | int |
0x06 | Unsigned int |
0x07 | float |
0x08 | double |
其他 | 请自定义,数据解析方式请说明 |
总数据长度:需要发送的数据的总个数,请根据实际情况进行定义;
数据起始位置:当前发送帧所携带数据的第一个数据在总数据的位置信息;
数据长度:为该帧携带的有效数据长度;
10.Crc:为由ID到data段生成的0~4Byte校验码,其校验码生成方式见附录,请尽可能只用其定义的CRC-8、CRC-16和CRC-32;
数据说明:
仪器数据按小端模式,即当数据为0xFFF67B6A,其串口发送先发送0x6A,…,0xFF。
本协议中,共分为4个等级,
typedef enum
{
EMERGENCY_LOW,
EMERGENCY_NORMAL,
EMERGENCY_HIGH,
EMERGENCY_VERY_HIGH,
}EMERGENCY_STATE;
对于紧急度为EMERGENCY_VERY_HIGH的要优先任何情况进行优先处理,EMERGENCY_HIGH等级的低于重发机制下的命令且低于EMERGENCY_VERY_HIGH,优先等级依次递减。
任何模块收到非应答帧(ACK帧)度需要对该帧进行应答,应答帧一般默认紧急程度为最高,应答应在系统设定时间内完成。当超过最大应答时间,该帧发送方需要进行重新发送,最大次数为3次,三次未应答,可能通信系统异常,进行错误处理。对于接收端,对同帧号的帧应该只处理处理一次。
错误帧主要是携带仪器在运行过程中的错误信息,错误信息通过编码携带。其具体格式定义如下:
1 | 2 | 3 | 4 | 5 |
错误等级 | 错误编码 |
编码 | 数据类型 |
0x01 | Class A |
0x02 | Class B |
0x03 | Class C |
0x04~0xFF | 其他,请自定义 |