MavLink通信协议开发环境搭建(Windows)
MavLink官网地址
1 使用git克隆MavLink仓库
git clone https://github.com/mavlink/mavlink.git --recursive
2 安装Python的Future库
pip install future
3 打开MavLink仓库下的mavgenerate.py,运行,出现GUI界面
4 XML选择仓库下的message_definitions/v1.0/common.xml(此为官方基础消息库,自定义消息选择自己的XML文件亦可)OUT选择生成路径Language选择目标语言,本文选择C++ Protocol选择协议版本,本文选择2.0
5 点击Generate生成目标文件,选择C++则为生成对应的头文件.h,我将在下篇文章中介绍使用方法
MavLink通信协议 C++应用详细教程
在项目中包含mavlink库
在vs2019开发环境中使用mavlink通信协议,首先需要将下载好的mavlink库添加至项目包含目录。
即项目->属性->配置属性->VC++目录->包含目录->选择你的文件路径,如下图,然后点击确定,应用。
然后在头文件中包含如下文件
#include<common/mavlink.h>
在自己的程序中使用MavLink库
MavLink c++库解 ADS-B消息 示例代码
/************************************************************************************************************************************************
* @author : *
* @date : *
* @file : *
* @brief : MavLink c++库 解 ADS-B消息 简单使用教程 *
* --------------------------------------------------------------------------------------------------------------------------------------------- *
* Change History *
* --------------------------------------------------------------------------------------------------------------------------------------------- *
* Date | Version | Author | Description *
* --------------------------------------------------------------------------------------------------------------------------------------------- *
* | | | *
************************************************************************************************************************************************/
#include <iostream>
#include <fstream>
#include<common/mavlink.h>
#include <cassert>
int fileStrLen = 0;
char fileBuffer[1024] = { 0 };
char MavLinkBuffer[1024] = { 0 };
int HexFromString(char SouceStr[], char DstStr[]);
int readFile(const char* fileDir, char DstStr[]);
int main()
{
uint8_t chan = MAVLINK_COMM_0;//第一个参数,默认取该值
uint8_t buffer[100] = {};//这是你接收到的原始信息,并按照2.2.1章节将其转化为了uint8_t数组形式
mavlink_message_t rmsg;//第三个参数,用于存储解析完成的内容
mavlink_status_t status;//第四个参数,用于存储解析状态
// 读取十六进制报文
readFile("MavLinkdata.txt", fileBuffer);
HexFromString(fileBuffer, MavLinkBuffer);
int len = fileStrLen - 1;
for (int i = 0; i < len; i++)
{
if (mavlink_parse_char(chan, MavLinkBuffer[i], &rmsg, &status) == 1)
{
//进一步操作
switch (rmsg.msgid)
{
case MAVLINK_MSG_ID_HEARTBEAT:
mavlink_heartbeat_t heartbeat;
mavlink_msg_heartbeat_decode(&rmsg, &heartbeat);
std::cout << "type:" << (int)heartbeat.type << std::endl;
break;
case MAVLINK_MSG_ID_ADSB_VEHICLE:
mavlink_adsb_vehicle_t adsb_vehicle;
mavlink_msg_adsb_vehicle_decode(&rmsg, &adsb_vehicle);
std::cout << std::dec << "\nLat:" << adsb_vehicle.lat << " Long:" << adsb_vehicle.lon << std::endl;
break;
default:
break;
}
}
}
return 0;
}
/************************************************************************************************************************************************
# @author : WLJ
# @date :
# @file :
# @brief : 将十六进制字符串转换为十六进制数组存放到变量中
# @Function :
# @Parameter:
# SouceStr:十六进制字符串 eg:0xFE0x0C0x120x01......
# DstStr:转换得到的十六进制数组 eg:{0xFE, 0x0C, 0x12, 0x01......}
#
# @Return :
#
#
************************************************************************************************************************************************/
int HexFromString(char SouceStr[], char DstStr[])
{
char tepHex[5];
int num = 0;
std::cout << "len=" << sizeof(DstStr) << std::endl;
for (int i = 0; i < fileStrLen-1; i+=4)
{
strncpy_s(tepHex, SouceStr + i, 4);
tepHex[4] = '\0';
sscanf_s(tepHex, "%x", &DstStr[num]);
std::cout << tepHex << " ";
num++;
}
for (int i = 0; i < fileStrLen - 1; i++)
{
std::cout << std::hex << DstStr[i] << " ";
}
return 0;
}
/************************************************************************************************************************************************
# @author : WLJ
# @date :
# @file :
# @brief : fstream类读取文件
# @Function :
# @Parameter:
# DstStr:读取后的数据存放地址
#
# @Return :
#
#
************************************************************************************************************************************************/
int readFile(const char* fileDir, char DstStr[])
{
std::ifstream inFile;
inFile.open(fileDir, std::ios::in);
assert(inFile.is_open()); //若失败,则输出错误消息,并终止程序运行
if (inFile)
{
//可以像用cin那样用ifstream对象
uint8_t HexCh;
while (inFile >> HexCh) {
*DstStr++ = HexCh;
fileStrLen++;
//可以像 cout 那样使用 ofstream 对象
//std::cout << std::hex << HexCh << " ";
}
}
else
{
std::cout << "Open File failed!...\n";
}
return 0;
}