摘自:https://blog.csdn.net/weixin_43527214/article/details/104494867
mavlink协议发送与接收--串口版
绿波电龙 2020-02-25 12:57:46 376 收藏 1
分类专栏: mavlink
版权
mavlink官网
MAVLINK现分为两个版本V1和V2,区别是V2的MsgId扩展到24位,V1只有8位(0-255)。原理都是差不多的,这里以V1为例,V2也实际测试过,可以用。
一、安装移植
安装方法链接
这里不过多解释,官网步骤很详细,需要注意的是,安装前先安装好Python3环境和Git,方法百度都有。另外我们需要的是C代码(移植到stm32上),官方用Python脚本写了个代码生成器(GUI),需要在这个脚本的当前目录下运行脚本,python mavgenerate.py
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225122215798.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUyNzIxNA==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225122441763.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUyNzIxNA==,size_16,color_FFFFFF,t_70)
XML路径:F:\mavlink\mavlink\message_definitions\v1.0\common.xml
输出路径任意
语言C语言
协议1.0
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225122806230.png)
然后把这些头文件都复制到STM32串口工程里,在main.c里面#include"mavlink.h", 编译后会报错,找到mavlink_types.h,找到如下部分,改动后如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225123135761.png)
然后添加一句#pragma anon_unions
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225123304475.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUyNzIxNA==,size_16,color_FFFFFF,t_70)
至此,移植完毕。
二、发送接收
发送:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225123522982.png)
发送流程三步走:
1,先打包(pack),将所有东西打包成msg
2,将msg转换成发送buff
3,调用底层发送函数(自己实现),发送buff
接收:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225123908225.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUyNzIxNA==,size_16,color_FFFFFF,t_70)
这里我用的串口空闲中断,当接收完一帧数据后,串口空闲中断产生,Rxcplt置1,然后主循环中判断Rxcplt
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225124142113.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUyNzIxNA==,size_16,color_FFFFFF,t_70)
当主函数检测到接收一帧数据后,开始调用mavlink_parse_char解析,将字符RX_BUF[i]解析成msg,如果解析结果为MAVLINK_FRAMING_OK,调用handle_message(&r_msg)处理这条消息
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225124749266.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUyNzIxNA==,size_16,color_FFFFFF,t_70)
测试效果:
MCU发送心跳包和压力包到电脑:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225125138308.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUyNzIxNA==,size_16,color_FFFFFF,t_70)
心跳包: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:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225125358646.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUyNzIxNA==,size_16,color_FFFFFF,t_70)
对比官网给出的包结构:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200225125622835.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUyNzIxNA==,size_16,color_FFFFFF,t_70)
完全正确!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)