参考连接: https://mavlink.io/zh/
整体说明
本文不探究mavlink协议的具体内容,只说明如何简单使用。环境: win10 c/c++
MAVLink仓库clone
我们其实clone的是一个工具,此工具可以帮我们把定义文件转成代码。发送端和接收端使用相同的代码,对数据进行打包和解包。
使用命令行:
git clone https://github.com/mavlink/mavlink.git --recursive
或者小乌龟:
![在这里插入图片描述](https://img-blog.csdnimg.cn/f0258a096fc4452c8b694c1e1ac5cdf9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oqA5pyv5LiN552A5oCl,size_19,color_FFFFFF,t_70,g_se,x_16#pic_center)
定义文件在:mavlink\message_definitions\v1.0文件夹下。打开test.xml,看看内容,应该就知道怎么写定义文件了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/0e84809dc369474e9d6344bdaa4f1415.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oqA5pyv5LiN552A5oCl,size_11,color_FFFFFF,t_70,g_se,x_16#pic_center)
如何打开这个工具?
此工具是用Python写的,所以需要安装python,我们去官网下载最新的即可。官网
安装时,需要把python加入到环境变量(勾选下图红框选项)。默认安装即可(Install Now)
![在这里插入图片描述](https://img-blog.csdnimg.cn/79ca60be29704c1392ec61a660623086.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oqA5pyv5LiN552A5oCl,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
安装python的future模块
用命令行安装
![在这里插入图片描述](https://img-blog.csdnimg.cn/266a1687d6504279b591e83c8b06012f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oqA5pyv5LiN552A5oCl,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
鼠标双击mavlink\mavgenerate.py文件,工具就打开了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/ce869577cf2443009f90ad1093ad4434.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oqA5pyv5LiN552A5oCl,size_10,color_FFFFFF,t_70,g_se,x_16#pic_center)
如何使用这个工具?
首先需要选择一个定义文件。
本例中,将mavlink\message_definitions\v1.0\test.xml复制一份重命名为mavlinktest.xml。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2b28107856d14e81bc54c4f8914f08ba.png#pic_center)
用记事本打开,将消息的名字改成MY_MAV。其它内容不变。要注意的是:定义文件中定义的数组长度都是3。写代码的时候得保持一致。
![在这里插入图片描述](https://img-blog.csdnimg.cn/8069bc3b125d4728bf8a3b021704bff7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oqA5pyv5LiN552A5oCl,size_17,color_FFFFFF,t_70,g_se,x_16#pic_center)
然后使用工具将这份定义文件变成代码。
![在这里插入图片描述](https://img-blog.csdnimg.cn/cf4090afaba54abf9f7243d5fbf54248.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oqA5pyv5LiN552A5oCl,size_15,color_FFFFFF,t_70,g_se,x_16#pic_center)
生成的文件如下图所示。实际应用时,将生成的文件放到工程里,并包含一个头文件#include “mavlinktest/mavlink.h”。
从生成文件可以得知:mavlinktest文件夹的名字是定义文件的名字。
![在这里插入图片描述](https://img-blog.csdnimg.cn/8fae9c25458144bd9a1518e971f56cc4.png#pic_center)
简单的代码示例
用vs2019新建一个控制台应用程序MavlinkTest。将生成的代码复制到工程里去。目录结构如下
![在这里插入图片描述](https://img-blog.csdnimg.cn/c63c0c76e120495d8b68fb5c60442cc9.png#pic_center)
主函数如下
#include <iostream>
#include "mavlinktest/mavlink.h"
int main() {
mavlink_message_t msg;
uint8_t uint8_t_array[3] = {0, 1, 2};
uint16_t uint16_t_array[3] = {0, 1, 2};
uint32_t uint32_t_array[3] = {0, 1, 2};
uint64_t uint64_t_array[3] = {0, 1, 2};
int8_t int8_t_array[3] = {0, 1, 2};
int16_t int16_t_array[3] = {0, 1, 2};
int32_t int32_t_array[3] = {0, 1, 2};
int64_t int64_t_array[3] = {0, 1, 2};
float float_array[3] = {0, 1, 2};
double double_array[3] = {0, 1, 2};
mavlink_msg_my_mav_pack_chan(
0, 0, 0, &msg, 'a', "hello world!", 1, 1, 1, 1,
1, 1, 1, 1, 1.1, 1.1, uint8_t_array,
uint16_t_array, uint32_t_array, uint64_t_array,
int8_t_array, int16_t_array, int32_t_array,
int64_t_array, float_array, double_array);
uint8_t buf[512] = {0};
uint16_t rlen = mavlink_msg_to_send_buffer(buf, &msg);
for (int i = 0; i < rlen; i++) {
mavlink_status_t rstatus;
mavlink_message_t rmsg;
if (mavlink_parse_char(0, (uint8_t)(buf[i]), &rmsg, &rstatus) == 1) {
switch (rmsg.msgid) {
case MAVLINK_MSG_ID_MY_MAV:
mavlink_my_mav_t my_mav;
mavlink_msg_my_mav_decode(&rmsg, &my_mav);
std::cout << my_mav.c;
break;
default:
break;
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)