Mavlink 协议硬解析主要代码

2023-05-16

int MAVLinkProtocol::ParseMsg(BYTE arMsgBuf[], MSGVALUE *pMavMsg, CString &strMsgText)
{
	// Function    : 
	// Parameters  : arMsgBuf - 为完整的 mavlink msg 缓冲区, 从 0xFE 开始到 最后一个校验字节(CKB)
	// Return value: 
	// Remark      : 

	int  i, nOfst, nLenMaxPayload;
	BYTE nMsgID;
	char szTmpName[LEN_MSGNM];

	char szStatusTxt[MAVLINK_MSG_ID_STATUSTEXT_LEN];
	char szValueID[MAVLINK_MSG_PARAM_VALUE_FIELD_PARAM_ID_LEN];
	CString strTmp, strUnicodeTmp;


	i = 0;
	nOfst = 0;

	if(arMsgBuf[0] != 0xfe)
		return -1;

	nMsgID = arMsgBuf[5];
	ASSERT(nMsgID < 256);

	nLenMaxPayload = arMsgBuf[1];
	ASSERT(nLenMaxPayload > 0 && nLenMaxPayload < MAVLINK_MAX_PAYLOAD_LEN);


	// 获取 message 字段个数
	pMavMsg ->nFieldCnts = g_arMsgInfo[nMsgID].num_fields;

	// 获取 message 名称
	memset(szTmpName, 0x00, sizeof(szTmpName));
	if(strlen(g_arMsgInfo[nMsgID].name) < LEN_MSGNM)
		strcpy(szTmpName,  g_arMsgInfo[nMsgID].name);
	else
		strncpy(szTmpName, g_arMsgInfo[nMsgID].name, LEN_MSGNM - 1);
	
	strUnicodeTmp = AnsiStr2Unicode(szTmpName);
	if(strUnicodeTmp.GetLength() > LEN_MSGNM - 1)
		strUnicodeTmp = strUnicodeTmp.Left(LEN_MSGNM - 1);
	_tcscpy(pMavMsg ->szMsgName, strUnicodeTmp);

	

	// 根据 g_arMsgInfo[] 获取并处理各字段信息
	for(i = 0; i < pMavMsg ->nFieldCnts; i++)
	{
		strUnicodeTmp = AnsiStr2Unicode((char *) g_arMsgInfo[nMsgID].fields[i].name);
		
		if(strUnicodeTmp.GetLength() > LEN_FIELDNM - 1)
			strUnicodeTmp = strUnicodeTmp.Left(LEN_FIELDNM - 1);
		
		_tcscpy(pMavMsg ->arField[i].szFieldNm, strUnicodeTmp);								// Field Name
		pMavMsg ->arField[i].nFieldTyp = g_arMsgInfo[nMsgID].fields[i].type;				// Field Type
		
		nOfst = g_arMsgInfo[nMsgID].fields[i].wire_offset;


		// 特殊消息的处理
		if(nMsgID == MAVLINK_MSG_ID_STATUSTEXT && i == 1)			
		{
			memset(szStatusTxt, 0x00, sizeof(szStatusTxt));
			memcpy(szStatusTxt, (arMsgBuf + MAVLINK_NUM_HEADER_BYTES + 1), MAVLINK_MSG_ID_STATUSTEXT_LEN);		// 1 为 字符串位置相对载荷开始位置的偏移
			strMsgText = AnsiStr2Unicode(szStatusTxt);
		}
		else if(nMsgID == MAVLINK_MSG_ID_PARAM_VALUE && i == 3)
		{
			memset(szValueID, 0x00, sizeof(szValueID));
			memcpy(szValueID, (arMsgBuf + MAVLINK_NUM_HEADER_BYTES + 8), MAVLINK_MSG_PARAM_VALUE_FIELD_PARAM_ID_LEN);
			strMsgText = AnsiStr2Unicode(szValueID);
		}
		else if(nMsgID == MAVLINK_MSG_ID_PARAM_SET && i == 3)
		{
			memcpy(szValueID, (arMsgBuf + MAVLINK_NUM_HEADER_BYTES + 6), MAVLINK_MSG_PARAM_VALUE_FIELD_PARAM_ID_LEN);
			strMsgText = AnsiStr2Unicode(szValueID);
		}
		else
		{
			// 一般 mavlink msg 的处理

			// 获取每个数值所存储的缓冲区
			if(g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_CHAR || 
			   g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_UINT8_T || 
			   g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_INT8_T)
			{
				pMavMsg ->arField[i].arData[0] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst];
				ASSERT(nOfst < nLenMaxPayload);
			}
			else if(g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_UINT16_T || 
				g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_INT16_T)
			{
				pMavMsg ->arField[i].arData[0] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst];
				pMavMsg ->arField[i].arData[1] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 1];
				
				ASSERT(nOfst + 1 < nLenMaxPayload);
			}
			else if(g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_UINT32_T || 
				g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_INT32_T)
			{
				pMavMsg ->arField[i].arData[0] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst];
				pMavMsg ->arField[i].arData[1] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 1];
				pMavMsg ->arField[i].arData[2] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 2];
				pMavMsg ->arField[i].arData[3] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 3];
				
				ASSERT(nOfst + 3 < nLenMaxPayload);
			}
			else if(g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_UINT64_T ||
				g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_INT64_T)
			{
				pMavMsg ->arField[i].arData[0] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst];
				pMavMsg ->arField[i].arData[1] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 1];
				pMavMsg ->arField[i].arData[2] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 2];
				pMavMsg ->arField[i].arData[3] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 3];
				pMavMsg ->arField[i].arData[4] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 4];
				pMavMsg ->arField[i].arData[5] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 5];
				pMavMsg ->arField[i].arData[6] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 6];
				pMavMsg ->arField[i].arData[7] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 7];
				
				ASSERT(nOfst + 7 < nLenMaxPayload);
			}
			else if(g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_FLOAT)			// 4 byte
			{
				pMavMsg ->arField[i].arData[0] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst];
				pMavMsg ->arField[i].arData[1] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 1];
				pMavMsg ->arField[i].arData[2] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 2];
				pMavMsg ->arField[i].arData[3] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 3];
				
				ASSERT(nOfst + 3 < nLenMaxPayload);
			}
			else if(g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_DOUBLE)		// 8 byte
			{
				pMavMsg ->arField[i].arData[0] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst];
				pMavMsg ->arField[i].arData[1] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 1];
				pMavMsg ->arField[i].arData[2] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 2];
				pMavMsg ->arField[i].arData[3] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 3];
				pMavMsg ->arField[i].arData[4] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 4];
				pMavMsg ->arField[i].arData[5] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 5];
				pMavMsg ->arField[i].arData[6] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 6];
				pMavMsg ->arField[i].arData[7] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 7];	
				
				ASSERT(nOfst + 7 < nLenMaxPayload);
			}
			else 
			{
				TRACE(_T("\r\n> MAVLinkProtocol.ParseMsg - Unexpect field type: "));
				TRACE(_T("\r\n> MAVLinkProtocol.ParseMsg - g_arMsgInfo[nMsgID].fields[i].type = %d"), g_arMsgInfo[nMsgID].fields[i].type);
			}
		}
	}

	return nMsgID;
}


相关结构的定义:

	struct FIELDSVALUE
	{
		TCHAR	szFieldNm[LEN_FIELDNM];
		uint8_t nFieldTyp;
		BYTE    arData[8];										// 字段数值
	};
	
	struct MSGVALUE
	{
		TCHAR	szMsgName[LEN_MSGNM];
		uint8_t	nFieldCnts;
		
		FIELDSVALUE arField[MAVLINK_MAX_FIELDS];
	};


MAVLINK_MESSAGE_INFO 的定义见 mavlink\v1.0\common\common.h

static mavlink_message_info_t g_arMsgInfo[256] = MAVLINK_MESSAGE_INFO



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mavlink 协议硬解析主要代码 的相关文章

随机推荐

  • 手机自动访问generate_204

    近来写WiFi钓鱼demo xff0c 需要让手机连接 WiFi 后自动跳转到指定网页 xff0c 于是对手机进行dns拦截 在对手机的流量分析中发现一件很神奇的事 xff0c 手机接入WiFi后会自动访问 generate 204 以下是
  • MT7621方案 LED 灯控制 (基于OpenWrt平台)

    注 xff1a 出处不明 xff0c 最开始是在这里看到的 xff0c 图竟然没有 没有 相关资料也几乎木有 datasheet里也没有寄存器配置说明 MT7621还真是坑爹啊 xff01 目前市面上大部分路由器方案是基于MT7620的 x
  • ROS分布式通信,Jetson Nano 与PC机通信

    Jetson Nano 与PC机通信 1 环境2 SSH安装3 修改hosts文件4 修改环境变量文件 xff5e bashrc5 测试 1 环境 PC笔记本 xff1a Ubuntu 18 04 5 LTS Jetson Nano Ubu
  • .Net6.0系列-6 .Net 6LinQ(二)常用扩展方法

    一 本节学习LinQ的扩展方法 LinQ的where返回的IEnumerable 所有的括号中都可以写lamada表达式 list 数组等都可以用LinQ 以下这些方法都是可以和Where一起使用的 Count 返回的是满足条件的个数 An
  • postman简单上手教程

    1 xff1a postman浏览器已经停止更新了 xff0c 所以下面介绍的是app版本 2 xff1a 打开postman xff0c 创建自己的测试目录 xff0c 点加号创建 xff0c 这里我创建了test project 3 x
  • 实战microPython(06)-OLED屏的使用(2)

    实战microPython 06 OLED屏的使用 2 David Zou 2018 11 27 大家好 xff0c 上次介绍了OLED显示屏的相关知识 xff0c 今天 xff0c 我们进入实战 xff0c 学习如何使用OLED显示屏 如
  • C++实现HTTP上传

    插件中需要一个上传文件的功能 xff0c 我跟老大说 xff0c 我想FTP上传 xff0c 老大一瞪眼 xff0c 那还得再布个FTP服务器 xff0c 直接用HTTP上传多简单 那么C 43 43 如何将文件上传HTTP服务器上呢 xf
  • RTK和GPS定位

    首先 xff0c 简要说一下GPS和RTK的工作原理 GPS定位的基本原理是 xff0c 测量出已知位置的卫星到地面GPS接收器之间的距离 xff0c 然后接收器通过与至少4颗卫星通讯 xff0c 计算与这些卫星间的距离 xff0c 就能确
  • 基于VC6的UAV地面站(GCS)程序及源代码

    此地面站 xff08 GCS603 xff09 是早年针对北航一款小飞控开发的 xff0c 那个时候APM好像都才刚刚问世 程序具备了简单地面站的基本功能 xff0c 如界面绘制 串口数据读写 数据记录 数据帧的合成与解析 航线设置等 此程
  • ArduPlane plane 部分功能与代码移植到 GCC(Atmel studio 6.2)版本的程序源代码 HelloPilot

    几年前由于当时 ArduPlane xff08 Ver2 76 xff09 的开发环境为arduino ide 开发尤其是调试环境非常不友好 xff0c 要进行程序调试及跟踪非常不方便 xff0c 同时出于学习掌握arduplane代码原理
  • 简单的说说飞控硬件研发过程中的各种坑

    我们的飞控 xff0c 从当初第一个概念设计到现在 xff0c 历时好几年 xff0c 目前经过上百架次的试飞 xff0c 功能已经基本完备 回首前面走过的历程 xff0c 不说尸横遍野吧 xff0c 至少也是血泪斑斑 有无数的坑需要投入大
  • 1、无人系统控制站软件开发平台 CSS(Control Station Studio)概述

    1 初衷 在CSS之前 xff0c 通过参与开发数个大中型无人机地面控制站项目 xff0c 在GCS xff08 Ground Control Station xff09 设计与实现方面积累了一些经验和感悟 在先前的开发过程中 xff0c
  • .Net6.0系列-7 .Net 6LinQ(三)常用扩展方法

    一 投影 把集合中的每一项转换为另一种类型使用的是Select 方法 where 的返回集合是Enumerable 返回的是T的全部字段 而Select是可以返回集合的任意需要的字段 find 是在lamada表达式中的使用 以上两个是Li
  • 一款适于作为飞行试验平台的小四轴设计

    四轴虽小 xff0c 但也是第7版改进设计了 xff0c 定型了 xff01 优点 1 安全性高 作为实验平台 xff0c 最大的风险来自于失控 小四轴 xff08 是的 xff0c 它现在还没名字 xff09 可靠的旋翼保护圈以及其他保护
  • 上手Nucleo H743ZI 开发板下载失败问题解决方法

    准备研究Stm32H7 xff0c 买了块Nucleo H743ZI开发板回来研究 之前一直使用的是stm32F4 xff0c 开发环境为keil 5 13 43 STM32F4xx DFP 2 10 0 st linkV2 开工之前仔细读
  • 固定翼武德充沛,多旋翼费拉不堪

    实际飞行测试 同样的动力组合 xff1a 2205电机 43 5030 3叶桨 同样的动力电池 xff1a 2200ma xff0c 3s xff0c 20c 基本一致的起飞全重 xff1a 固定翼680g xff0c 多轴700g 续航时
  • PH7系统简介

    PH7系统简介 PH7是什么 xff1f 狭义的PH7是一套以无人机飞控为典型应用案例 xff0c 涵盖无人车或船 GCS数据采集 伺服控制 AHRS 地面模拟仿真系统等的通用控制器代码框架 xff0c 该框架以Stm32CubeMx生成代
  • 小型无人机的布线与布局设计

    小型无人机的布线与布局设计 xff0c 似乎看上去像是在总体设计当中一个细枝末节 xff0c 是往往会被忽略掉的部分 但实际上 xff0c 布线与布局虽然不像飞控算法设计 飞行平台气动设计是总体设计当中最核心和最重要的部分 xff0c 但却
  • Bread Board Pilot 即将发布

    Bread Board Pilot xff08 简称BBP xff09 为基于 PH7 代码框架 xff08 PH7 系统简介 xff09 的一款飞控快速原型开发板 相比传统飞控板 xff0c BBP 的硬件设计具有以下突出特点 xff1a
  • Mavlink 协议硬解析主要代码

    int MAVLinkProtocol ParseMsg BYTE arMsgBuf MSGVALUE pMavMsg CString amp strMsgText Function Parameters arMsgBuf 为完整的 mav