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

    浏览量

    22803
  • C代码
    +关注

    关注

    1

    文章

    90

    浏览量

    15237
  • mavlink
    +关注

    关注

    0

    文章

    9

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    在SE050C1中生成 ECC NIST p-521 密钥对遇到的疑问求解

    我正在尝试使用即插即用中间件在 ESP32 的SE050C1中生成 NIST p-521 密钥对。 我尝试打开一个安全会话尝试生成密钥,但我未能打开一个安全会话 SCP
    发表于 04-20 06:50

    Onsemi NTLUS030N03C MOSFET 深度解析

    Onsemi NTLUS030N03C MOSFET 深度解析 在电子设计领域,MOSFET 作为关键的功率开关元件,其性能和特性对电路设计的成败起着至关重要的作用。今天我们来深入了解 Onsemi
    的头像 发表于 04-14 09:25 413次阅读

    onsemi NVMFS4C03N 和 NVMFS4C303N MOSFET 深度解析

    onsemi NVMFS4C03N 和 NVMFS4C303N MOSFET 深度解析 在电子设计领域,MOSFET 作为关键的功率器件,对于电路的性能和效率起着至关重要的作用。今天我们来深入探讨
    的头像 发表于 04-09 16:25 205次阅读

    驱动之路#20:Pinctrl 在手,引脚复用很顺手

     欢迎关注,每周更新!☞ 本合集分享的是,我当初学习Linux驱动的来时路——《《驱动之路》开篇:自序pinctrl节点下(rk3576-pinctrl.dtsi),定义具体的引脚配置(复用
    的头像 发表于 04-07 21:18 471次阅读
    驱动<b class='flag-5'>之路</b>#20:Pinctrl 在手,引脚复用很顺手

    c语言中的代码优化

    变量。固然,在定义变量后不要超过变量的做用范围,若是超过变量的范围赋值,C编译器并不报错,但程序运行结果却错了,并且这样的错误很难发现。 在ICCAVR,能够在Options设定
    发表于 01-12 09:45

    深入解析HVMA03F40C - ST10S Flyback Transformer

    深入解析HVMA03F40C - ST10S Flyback Transformer 引言 在电子工程领域,变压器是众多电路不可或缺的关键组件。今天,我们将详细探讨Bourns公司
    的头像 发表于 12-22 16:50 635次阅读

    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

    机智云配网教程 第二期:生成MCU代码包与调试

    在上一期,我们介绍了机智云GAgent固件的烧录过程,并在测试完成了机智云开发者账号的注册及数据点的创建。接下来,我将继续为大家讲解如何生成MCU代码包。数据点创建登录机智云开发者
    的头像 发表于 06-28 10:02 1036次阅读
    机智云配网教程 第二期:<b class='flag-5'>生成</b>MCU<b class='flag-5'>代码</b>包与调试

    XML介绍

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

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

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

    如何在不使用USB控制器的情况下对CYPD2119-24LQXI自定义配置进行编程?

    我想要编程(如果可能的话通过 SWD)一个自定义但相当基本的“Type-C 到 DP”AltMode 适配器功能,到安装在自定义 PCB 上的CYPD2119-24LQXI设备上。 我已经下载了
    发表于 05-13 06:35