CRC计算
UAVCAN的CRC计算是针对多帧拼包后的数据段进行的,其中不包括每帧的尾,也就是最多7个Byte,如下图中部分:
但是在计算之前,为了保证帧内内容与发送者协议一致(I guess),需要在数据段前增加数据协议类型特征码(data type signiture,是dsdl编译生成的,简单理解为与协议结构体绑定),如下图,在数据前面添加。
举个例子--解1063.Fix2包
如协议中,Fix2包有62个字节,即解算时,应该在这62个字节前面加上8个字节(data type signiture)再进行CRC计算:
uint16_t crc = crc_ccitt(signiture , sizeof(signiture ), 0xffff);//crc种子是0xffff,如协议描述
crc = crc_ccitt(payload , sizeof(Fix2 ), crc);
计算所得crc即与数据包中符合
关键在于signature的获取
signiture的计算对于Fix2这种包里面还含有其它协议的数据包,是一个递归计算的过程,在Fix2中可以简单的将计算结果取出来