ArduPilot MavLink通信中PARAM_VALUE响应无法解析问题
问题根因
你对照的是新版MAVLink协议文档的PARAM_VALUE字段顺序,去解析ArduCopter V3.2.1这个2015年发布的老固件所使用的旧版MAVLink1协议消息,字段完全错位,不存在硬件或固件故障。
你贴出的25字节PARAM_VALUE载荷完全符合旧版协议定义,按旧版字段顺序解析结果完全正常:
<Buffer cd cc 4c 3f 32 01 36 00 45 4b 46 5f 43 48 45 43 4b 5f 54 48 52 45 53 48 09>
旧版MAVLink1中PARAM_VALUE(#22)的字段顺序、对应解析结果如下:
- 偏移0位起4字节(小端float):
cd cc 4c 3f转浮点值为0.8,是参数EKF_CHECK_THRESH的默认值 - 偏移4位起2字节(小端uint16):
32 01转十进制为306,是ArduCopter V3.2.1版本的总参数个数,数值固定不会随响应变化 - 偏移6位起2字节(小端uint16):
36 00转十进制为54,对应当前参数的序号 - 偏移8位起16字节(char数组):
45 4b 46 5f 43 48 45 43 4b 5f 54 48 52 45 53 48转ASCII为EKF_CHECK_THRESH,完全符合参数名规则,你之前看到的前8字节乱码、第8字节恒为nul,是错把param_value、param_count、param_index的8字节内容当成了param_id的开头 - 偏移24位起1字节(uint8):
09对应MAV_PARAM_TYPE_REAL32(单精度浮点型),完全符合参数类型取值范围0~10的要求
问题背景
MAVLink协议早期迭代时调整过PARAM_VALUE消息的字段排序,新版文档把param_id放到了结构体最开头,和2015年前后APM飞控使用的v0.9版本MAVLink1定义不兼容。你之前解析其他消息无异常,是因为其余消息的字段顺序在后续版本中没有做过调整。
修复方案
调整PARAM_VALUE消息的解析偏移,按上述旧版字段顺序解析即可,注意16字节的param_id如果占满全部长度,不会自带字符串终止符,需要手动补\0避免字符串读取越界。如果后续要兼容新旧版本固件/MAVLink版本,可以在握手阶段根据协议版本、固件版本切换对应的解析逻辑。
内容的提问来源于stack exchange,提问作者Pchevald
相关产品推荐
相关产品推荐

