mavlink官网
MAVLINK现分为两个版本V1和V2,区别是V2的MsgId扩展到24位,V1只有8位(0-255)。原理都是差不多的,这里以V1为例,V2也实际测试过,可以用。
一、安装移植
安装方法链接
这里不过多解释,官网步骤很详细,需要注意的是,安装前先安装好Python3环境和Git,方法百度都有。另外我们需要的是C代码(移植到stm32上),官方用Python脚本写了个代码生成器(GUI),需要在这个脚本的当前目录下运行脚本,python mavgenerate.py
XML路径:F:\mavlink\mavlink\message_definitions\v1.0\common.xml
输出路径任意
语言C语言
协议1.0
然后把这些头文件都复制到STM32串口工程里,在main.c里面#include"mavlink.h", 编译后会报错,找到mavlink_types.h,找到如下部分,改动后如下:
然后添加一句#pragma anon_unions
至此,移植完毕。
二、发送接收
发送:
发送流程三步走:
1,先打包(pack),将所有东西打包成msg
2,将msg转换成发送buff
3,调用底层发送函数(自己实现),发送buff
接收:
这里我用的串口空闲中断,当接收完一帧数据后,串口空闲中断产生,Rxcplt置1,然后主循环中判断Rxcplt
当主函数检测到接收一帧数据后,开始调用mavlink_parse_char解析,将字符RX_BUF[i]解析成msg,如果解析结果为MAVLINK_FRAMING_OK,调用handle_message(&r_msg)处理这条消息
测试效果:
MCU发送心跳包和压力包到电脑:
心跳包:FE 09 00 14 C8 00 01 00 00 00 00 00 00 03 03 B8 9E
压力包:FE 10 01 14 C8 1C E8 03 00 00 00 00 00 00 70 17 00 00 00 00 23 00 7B B5
电脑发送压力包到MCU:
对比官网给出的包结构:
完全正确!