MavLink 库 c++环境搭建及解ADS-B消息教程

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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值