这段时间做一个项目要进行MAVLINK的解包校验,但有一个叫做 CRC_EXTRA的位导致这个校验码怎么算结果都不对,后来找了好久还是在github的论坛上看见别人讨论才找到方法的。
1、先上从官网上拿的mavlink包格式
图里字有点小,放大可以看到,最后两个字节是校验码,然后校验方法是CRC-16/MCRF4XX,校验范围是1-n+6(即除去包头和校验字节)再额外加上一个叫 CRC_EXTRA的东西。
2、首先说这个校验方法,之前不知道从哪里看到的说是用CRC16CCITT校验,看到官方的才发现原来是CRC-16/MCRF4XX。这个校验方法在这个网站有它的在线校验器,16进制(CRC16)(多项式异或,多种)校验(2),循环冗余校验在线计算器_三贝计算网_23bei.com。这里就说一下它的几个参数,
算法名称 多项式 初始值 结果异或 输入反转 输出反转
CRC-16/MCRF4XX 1021 FFFF 0000 true true
3、然后再说最关键的,校验计算的时候不但要算进去收到的1-n+6范围内的数据,还要加上一个CRC_EXTRA,而这个东西的值是从如下数组中取得的,对应的序号是收到数据包中的Messa ID字节+1。(当用c程序实现的时候直接用Messa ID当数组下标就能取到了)
crc-extra in array
50, 124, 137, 0, 237, 217, 104, 119, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 214, 159, 220, 168, 24, 23, 170, 144, 67, 115, 39, 246, 185, 104, 237, 244, 222, 212, 9, 254, 230, 28, 28, 132, 221, 232, 11, 153, 41, 39, 214, 223, 141, 33, 15, 3, 100, 24, 239, 238, 30, 200, 183, 0, 130, 0, 148, 21, 0, 52, 124, 0, 0, 0, 20, 0, 152, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 183, 63, 54, 0, 0, 0, 0, 0, 0, 0, 175, 102, 158, 208, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 49, 170, 44, 83, 46, 0
(sequential number crc-extra = #Message ID +1)
最后算出来之后注意一下高位低位的位置顺序就好了。
4、关于这个校验算法的程序实现,我是用c语言实现的,如果有人需要的话可以之后再贴出来。
我也是自己踩了太多坑,成功后才想开贴帮助后来的人避一下坑,有疑问的话欢迎讨论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)