二进制命令定长和不定长区分
不定长格式
以Ublox模块的UBX协议为例,如下图:
该协议的优点:
- 紧凑-使用8位二进制数据;
- 受保护的校验和-使用开销较低的校验和算法;
- 模块化-使用两阶段消息标识符(类和消息ID);
- 支持自定义字段扩展。
如上图 Payload 规定:
- 无特殊说明的情况下,一律按小端模式进行存储;
- 针对2字节长度的字段,必须从偏移地址为2的倍数的地方开始存储,至于4个字节长度的字段,必须从偏移地址为4的倍数的地方开始存储;
- 保留字段中,作为输出语句,保留字段可以不关心,但是保留字段作为输入语句,保留字段必须进行清零操作;
- 单双精度浮点数按照IEEE754标准进行存储。
校验(如上图):
CK_A = 0, CK_B = 0
For(I=0;I<N;I++)
{
CK_A = CK_A + Buffer[I]
CK_B = CK_B + CK_A
}
定长格式
以下格式为一个参考设计demo
该协议长度固定,有固定的协议头,每个数据字段的相对位置是固定的。
协议格式优点:
- 协议长度及字段位置为固定的,方便用户解析;
- 协议头确定,根据协议头进行区分,更加直观;
协议格式缺点:
- 非常不利于字段的扩展。