![b3740ca4897cb45d2c1c72be40f1fae8.png](https://i-blog.csdnimg.cn/blog_migrate/fc72644e9aee01ea4513736479d9460b.jpeg)
说明:
本文原创作者『strongerHuang』
首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop
一、写在前面
如果你前面两篇文章掌握了,说明你已经入门了。本文带你掌握如何在XML文件中定义Message(MSG消息)并生成C代码。
本文主要内容:
·如何在XML文件中定义Message(消息)
·如何通过生成器工具生成MAVLink C代码
提示:本文将结合上一篇文章提供下载的“MAVlink代码生成工具包”来讲述。
二、XML文件中定义MSG
2.1 关于MSG
MAVLink的MSG消息定义在XML文件中,通过生成器工具(Mavenerate或Mavgen)生成MAVLink C代码;
在MAVLink协议中,每一条MSG消息都具有一个ID,且ID具有唯一性。MSG消息ID其实就是对应协议格式中msgid,如下图:
![23d95e4b3901452d56235b149497797c.png](https://i-blog.csdnimg.cn/blog_migrate/cd9c0db42fdc3eddf51b8fbb5f8c75b4.jpeg)
简单来说:在xml中定义一条Message消息,通过生成器工具就能生成该Message对应的C代码(一条Message也可以理解成一条通信命令)。
提示: 在MAVLink V1版本中,消息ID有效数字的范围为0到255。
其中0到149为公共消息ID(飞控系统共有消息,一般不建议用于自定义)。而150到240为用于自定义消息的ID范围。
比如,打开前面下载的工具包消息定义的文件夹(如下图),可以看到:common.xml文件主要是一些公共消息ID范围为:0到149。而其它xml文件是针对不同系统定义的消息,主要集中在150到240之间。
![d5e7b2c2ea1eedc9eeece0688665e3a3.png](https://i-blog.csdnimg.cn/blog_migrate/9634694fe4333dcd6d8ced5bcdc4c41c.jpeg)
2.2 MSG的定义方法
MAVLink的MSG消息定义在XML文件中,所以遵循XML语法规则。语法很简单(只需要记住部分常用的就行),我们可以参考MAVLink定义好的xml文件。
解压上一篇文章下载“MAVlink代码生成工具包”,打开(路径MAVLink message_definitions v1.0下)common.xml文件,我们以“心跳”为例:
![5b9e68972c5232de381645e6c04bd7ae.png](https://i-blog.csdnimg.cn/blog_migrate/272ab1950a8147ec9af6e5112056ad6b.jpeg)
从上图可以看出:“心跳”消息包含:消息ID、描述(注释)以及各项参数(可以理解为一个函数,及函数的参数)。
1.《message》《/message》标签
每条消息都被定义在这样一个消息标签内。
2.id=“0”
表示此消息的id或index编号为0。
3.name=“HEARTBEAT”
该ID编号对应的名称。
4.《description》《/description》
对该消息的描述,是一个非常重要,但可选的领域(意思是可以不用定义),可以理解为代码的注释。
5.《field》《/field》
对消息的一个字段进行定义,它类似于C语言中的一个变量,可以是8,16,32和64位长度(有符号或无符号),以及浮点类型等。
6.type=“uint8_t”
将此字段定义为8位无符号整数。数组的定义如下:type=“uint8_t[5]”。可以理解为一个函数参数的数据类型。
7.name = “type”
该字段的名称,可以理解为一个函数参数的名称。
8.Type of the MAV
字段说明,可以理解为函数参数的注释。
上面文字描述可能理解起来比较困难,看下图心跳消息对应生成的C代码:
![5bd926407a90b4ce5ccb9c66d6cec067.png](https://i-blog.csdnimg.cn/blog_migrate/75405e6b4e0b8535faa0e278a60e3977.jpeg)
以上举例,只是提供其中一个函数接口,其实还会生成更多与该消息相关的接口、结构体等。
2.3 enum的定义方法
上面2.2节在xml中定义消息明白了,这节enum(枚举)的定义就很容易理解了,原理一样。
枚举和消息只是内容有所差异,定义原理都类似。枚举包含:枚举名称,成员(元素)名称,成员值等。
枚举的定义就不详细描述出来,提供枚举xml定义和生成C代码,相信你一看就能明白。
xml中定义的MAV_AUTOPILOT:
![fc16be2b24671abcfd1e1e1c285b7d11.png](https://i-blog.csdnimg.cn/blog_migrate/e107f3ddd4cccf22d89c733dca207743.jpeg)
生成的C代码:
![59d71389db5be0770c3721469ff99432.png](https://i-blog.csdnimg.cn/blog_migrate/efd4bc40039c41bd3e850d54f3bd4f25.jpeg)
提示: 关于消息定义,更多的内容可以参看: http://qgroundcontrol.org/mavlink/create_new_mavlink_message
三、通过生成器工具生成MAVLink C代码
上面第二章节在xml文件中定义好了MSG消息和enum枚举,那么,就需要通过生成器工具生成我们最终需要的代码(我主要讲述生成C代码)。
MAVLink项目提供有生成器有两种:Mavgenerate(GUI)和Mavgen(命令行);
使用生成器工具前提需要搭建好环境,请参考:MAVLink学习之路02_工具下载、环境搭建
3.1 Mavgenerate生成C代码
这个工具使用方法很简单,环境搭建好之后,解压下载工具包,在当前路径下输入命令“python mavgenerate.py”,或者双击mavgenerate.py即可打开:
![3d1800b85ac0c2336623fc694929203e.png](https://i-blog.csdnimg.cn/blog_migrate/4c63af8c0a0c2779aa67a588bb83dc20.jpeg)
3.2 Mavgen生成C代码
Mavgen生成器是一个通过命令实现的工具,命令很简单,比如:python -m pymavlink.tools.mavgen --lang=C --wire-protocol=1.0 --output=generated/include/mavlink/v1.0 message_definitions/v1.0/common.xml 命令的具体描述请看下图:
![cde1963ee109f9e00e8d55d87009458d.png](https://i-blog.csdnimg.cn/blog_migrate/288f685b17df30a6a8ddd85c6cfdf20d.jpeg)
3.3 关于生成器几点提示
1.Mavgen支持的语言及版本
![1cf6553cd004656ce2ecc6d363e7be1f.png](https://i-blog.csdnimg.cn/blog_migrate/172813acf14292be14b2e4a1367138b5.jpeg)
2.路径
因为命令行生成器支持相对路径,建议将xml文件拷贝到如下路径:MAVLinkmessage_definitionsv1.0
3.命令语法和选项说明
![f584b4de32efb99a3fd48a9ab6b0a18b.png](https://i-blog.csdnimg.cn/blog_migrate/b042c0bd869cb0676d1048ce8f38b4ed.jpeg)
初学者不用深入理解,只需要知道如何生成C代码即可(参考我上面提供的哪一条命令)。
关于生成器工具更多的内容可以参考: https://mavlink.io/en/getting_started/generate_libraries.html
四、说明
1.该文档仅供个人学习使用,版权所有,禁止商用。
2.本文由我一个人编辑并整理,难免存在一些错误。
3.为了方便大家平时公交、地铁、外出办事也能用手机随时随地查看该教程,该教程同步更新于微信公众号『嵌入式专栏』,关注微信公众号回复【MAVLink学习之路】即可查看全系列教程。
五、最后
我的博客:http://www.strongerhuang.com
我的GitHub:https://github.com/EmbeddedDevelop
我的微信公众号(ID:strongerHuang)还在分享STM8、STM32、Keil、IAR、FreeRTOS、UCOS、RT-Thread、CANOpen、Modbus...等更多精彩内容,如果想查看更多内容,可以关注我的微信公众号『strongerHuang』。