参考连接: https://mavlink.io/zh/
本文不探究mavlink协议的具体内容,只说明如何简单使用。环境: win10 c/c++
我们其实clone的是一个工具,此工具可以帮我们把定义文件转成代码。发送端和接收端使用相同的代码,对数据进行打包和解包。
使用命令行:
git clone https://github.com/mavlink/mavlink.git --recursive
定义文件在:mavlink\message_definitions\v1.0文件夹下。打开test.xml,看看内容,应该就知道怎么写定义文件了。
此工具是用Python写的,所以需要安装python,我们去官网下载最新的即可。官网
安装时,需要把python加入到环境变量(勾选下图红框选项)。默认安装即可(Install Now)
安装python的future模块
用命令行安装
鼠标双击mavlink\mavgenerate.py文件,工具就打开了。
首先需要选择一个定义文件。
本例中,将mavlink\message_definitions\v1.0\test.xml复制一份重命名为mavlinktest.xml。
用记事本打开,将消息的名字改成MY_MAV。其它内容不变。要注意的是:定义文件中定义的数组长度都是3。写代码的时候得保持一致。
然后使用工具将这份定义文件变成代码。
生成的文件如下图所示。实际应用时,将生成的文件放到工程里,并包含一个头文件#include “mavlinktest/mavlink.h”。
从生成文件可以得知:mavlinktest文件夹的名字是定义文件的名字。
用vs2019新建一个控制台应用程序MavlinkTest。将生成的代码复制到工程里去。目录结构如下
主函数如下
// MavlinkTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include
#include "mavlinktest/mavlink.h"
int main() {
/*发送方:*/
// 第一步,打包msg
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 或 mavlink_msg_my_mav_encode_chan
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);
// 第二步,将msg转成uint8_t的数组,注意数组的长度一定要够长
uint8_t buf[512] = {0};
uint16_t rlen = mavlink_msg_to_send_buffer(buf, &msg);
// 第三步,通过网口、串口等其它的方式发送数组
// ...................
/*接收方:*/
//第一步,通过网口、串口等其它的方式将接收到的数据转成uint8_t[]
// ...................
// 第二步,逐字符解析
for (int i = 0; i < rlen; i++) {
mavlink_status_t rstatus;
mavlink_message_t rmsg;
//解析的状态, 在解析出问题时可以根据这个状态进行问题的跟踪
// std::cout << rstatus.parse_state;
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;
}
}
}
}