0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MAVLink学习之路03 _XML中定义MSG并生成C代码

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-07 16:46 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1写在前面

如果你前面两篇文章掌握了,说明你已经入门了。本文带你掌握如何在XML文件中定义Message(MSG消息)并生成C代码。

本文主要内容:

如何在XML文件中定义Message(消息)

如何通过生成器工具生成MAVLink C代码

提示:本文将结合上一篇文章提供下载的“MAVlink代码生成工具包”来讲述。

为了方便大家平时公交、地铁、外出办事也能用手机随时随地查看该教程,本文章收录于【MAVLink学习之路】,在微信公众号回复【MAVLink学习之路】即可查看。

2

XML文件中定义MSG

2.1 关于MSG

MAVLink的MSG消息定义在XML文件中,通过生成器工具(Mavenerate或Mavgen)生成MAVLink C代码;

在MAVLink协议中,每一条MSG消息都具有一个ID,且ID具有唯一性。MSG消息ID其实就是对应协议格式中msgid,如下图:

简单来说:在xml中定义一条Message消息,通过生成器工具就能生成该Message对应的C代码(一条Message也可以理解成一条通信命令)。

提示:

在MAVLink V1版本中,消息ID有效数字的范围为0到255。

其中0到149为公共消息ID(飞控系统共有消息,一般不建议用于自定义)。而150到240为用于自定义消息的ID范围。

比如,打开前面下载的工具包消息定义的文件夹(如下图),可以看到:common.xml文件主要是一些公共消息ID范围为:0到149。而其它xml文件是针对不同系统定义的消息,主要集中在150到240之间。

2.2 MSG的定义方法

MAVLink的MSG消息定义在XML文件中,所以遵循XML语法规则。语法很简单(只需要记住部分常用的就行),我们可以参考MAVLink定义好的xml文件。

解压上一篇文章下载“MAVlink代码生成工具包”,打开(路径MAVLink message_definitions v1.0下)common.xml文件,我们以“心跳”为例:

从上图可以看出:“心跳”消息包含:消息ID、描述(注释)以及各项参数(可以理解为一个函数,及函数的参数)。

1.标签

每条消息都被定义在这样一个消息标签内。

2.id=“0”

表示此消息的id或index编号为0。

3.name=“HEARTBEAT”

该ID编号对应的名称。

4.

对该消息的描述,是一个非常重要,但可选的领域(意思是可以不用定义),可以理解为代码的注释。

5.

对消息的一个字段进行定义,它类似于C语言中的一个变量,可以是8,16,32和64位长度(有符号或无符号),以及浮点类型等。

6.type=“uint8_t”

将此字段定义为8位无符号整数。数组的定义如下:type=“uint8_t[5]”。可以理解为一个函数参数的数据类型。

7.name = “type”

该字段的名称,可以理解为一个函数参数的名称。

8.Type of the MAV

字段说明,可以理解为函数参数的注释。

上面文字描述可能理解起来比较困难,看下图心跳消息对应生成的C代码:

以上举例,只是提供其中一个函数接口,其实还会生成更多与该消息相关的接口、结构体等。

2.3 enum的定义方法

上面2.2节在xml中定义消息明白了,这节enum(枚举)的定义就很容易理解了,原理一样。

枚举和消息只是内容有所差异,定义原理都类似。枚举包含:枚举名称,成员(元素)名称,成员值等。

枚举的定义就不详细描述出来,提供枚举xml定义和生成C代码,相信你一看就能明白。

xml中定义的MAV_AUTOPILOT:

生成的C代码:

提示:

关于消息定义,更多的内容可以参看:

http://qgroundcontrol.org/mavlink/create_new_mavlink_message

3

通过生成器工具生成MAVLink C代码

上面第二章节在xml文件中定义好了MSG消息和enum枚举,那么,就需要通过生成器工具生成我们最终需要的代码(我主要讲述生成C代码)。

MAVLink项目提供有生成器有两种:Mavgenerate(GUI)和Mavgen(命令行);

使用生成器工具前提需要搭建好环境,请参考:MAVLink学习之路02_工具下载、环境搭建

3.1 Mavgenerate生成C代码

这个工具使用方法很简单,环境搭建好之后,解压下载工具包,在当前路径下输入命令“python mavgenerate.py”,或者双击mavgenerate.py即可打开:

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 命令的具体描述请看下图:

3.3 关于生成器几点提示

1.Mavgen支持的语言及版本

2.路径

因为命令行生成器支持相对路径,建议将xml文件拷贝到如下路径:MAVLinkmessage_definitionsv1.0

3.命令语法和选项说明

初学者不用深入理解,只需要知道如何生成C代码即可(参考我上面提供的哪一条命令)。

关于生成器工具更多的内容可以参考:

https://mavlink.io/en/getting_started/generate_libraries.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 生成器
    +关注

    关注

    7

    文章

    322

    浏览量

    22505
  • C代码
    +关注

    关注

    1

    文章

    90

    浏览量

    15094
  • mavlink
    +关注

    关注

    0

    文章

    9

    浏览量

    2758
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言宏拼接运算符典型使用

    C语言中,##运算符(称为[size=16.002px]标记拼接运算符)用于宏定义中将两个标记(token)拼接成一个新的标记。它在预处理阶段处理,常用于动态生成变量名、函数名或类型名,以提高
    发表于 11-20 08:27

    使用Simulink自动生成浮点运算HDL代码(Part 1)

    封装在模块,方便使用HDL Workflow Advisor Ctrl + E 勾选使用浮点 右击模块启动HDL Workflow Advisor 按照步骤即可生成HDL
    发表于 10-22 06:48

    使用 LinkBoy 将程序导出为 C 语言代码烧录至 Arduino ESP32 开发板

    以下是使用 LinkBoy 将程序导出为 C 语言代码烧录至 Arduino ESP32 开发板的详细步骤指南: 一、准备工作 ✅ 硬件需求: 项目 要求 开发板 Arduino ESP32(支持
    发表于 10-16 12:41

    HarmonyOSAI编程编辑区代码生成

    展示本轮生成代码内容,通过不同颜色体现与当前代码的对比差异。 绿色区域:新生成代码内容。
    发表于 08-20 15:24

    HarmonyOS AI辅助编程工具(CodeGenie)UI生成

    UI Generator基于BitFun Platform AI能力平台,用于快速生成可编译、可运行的HarmonyOS UI工程,支持基于已有UI布局文件(XML),快速生成
    发表于 07-10 11:51

    XML介绍

    XML(可扩展标记语言)是一种用于描述数据的标记语言,旨在提供一种通用的方式来传输和存储数据,特别是Web应用程序中经常使用的数据。XML并不预定义标记。因此,XML更加灵活,并且可以
    发表于 06-23 08:03

    用CubeMX生成代码时会将main.c文件的汉字变成乱码,怎么解决?

    使用CubeMX生成代码时,经常会遇到原main.c文件的汉字全部变成乱码,如下图所示: 将这些乱码字符重新修改后,只要再次用CubeMX生成
    发表于 06-23 08:02

    custom.c定义代码无法自动保存怎么解决?

    我在custom.c插入自定义代码,当我不保存就切换到其他文件时,custom.c的自
    发表于 04-08 06:00

    如何使用UCANS32K146读取MAVLINK

    /user-guides/autopilot/the-cube-module-overview 我想要UCANS32K146读取飞控的所有诊断信息,被告知此信息是使用 MAVLINK 接口从飞控发送的。 是否有任何驱动程序或示例代码
    发表于 03-26 06:36

    A03-C1S12M(-1) A03-C1S12M(-1)

    电子发烧友网为你提供AIPULNION(AIPULNION)A03-C1S12M(-1)相关产品参数、数据手册,更有A03-C1S12M(-1)的引脚图、接线图、封装手册、中文资料、英文资料,A03-C1S12M(-1)真值表,
    发表于 03-18 18:32
    A<b class='flag-5'>03-C</b>1S12M(-1) A<b class='flag-5'>03-C</b>1S12M(-1)

    创建了用于OpenVINO™推理的自定义C++和Python代码,从C++代码获得的结果与Python代码不同是为什么?

    创建了用于OpenVINO™推理的自定义 C++ 和 Python* 代码。 在两个推理过程中使用相同的图像和模型。 从 C++ 代码
    发表于 03-06 06:22

    STM32CubeMX用于STM32配置和初始化C代码生成

    电子发烧友网站提供《STM32CubeMX用于STM32配置和初始化C代码生成.pdf》资料免费下载
    发表于 02-26 17:32 678次下载

    单片机学习C51源代码和Proteus仿真文件

    单片机学习C51源代码和Proteus仿真文件.zip, 有各种例子
    发表于 02-10 13:46 2次下载

    Flexus X 实例 C#/.Net Core 结合(git 代码管理、docker 自定义镜像)快速发布部署 - 让你的项目飞起来~

    与 Docker 容器化部署,实现代码高效管理与无缝迁移。即刻行动,让您的 Web 服务更加稳定、高效,领跑数字化转型之路! ���本实验深入演示了如何在 Ubuntu 环境,利用 Git 进行版本控制管理
    的头像 发表于 12-25 21:15 1018次阅读
    Flexus X 实例 <b class='flag-5'>C</b>#/.Net Core 结合(git <b class='flag-5'>代码</b>管理、docker 自<b class='flag-5'>定义</b>镜像)快速发布部署 - 让你的项目飞起来~

    SRIO介绍及xilinx的vivado 2017.4中生成srio例程代码解释

    1. 概述 本文是用于记录srio的学习情况,以及一些对xilinx的vivado 2017.4中生成srio例程代码的解释。 2. 参考文件 《pg007_srio_gen2》 3. SRIO协议
    的头像 发表于 12-10 16:24 4466次阅读
    SRIO介绍及xilinx的vivado 2017.4<b class='flag-5'>中生成</b>srio例程<b class='flag-5'>代码</b>解释