Mavlink 协议硬解析主要代码
- 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
版权声明:本文为博主原创文章,未经博主允许不得转载。
Mavlink 协议硬解析主要代码相关推荐
- mavlink协议_MAVLink学习之路03_XML中定义MSG并生成C代码
说明: 本文原创作者『strongerHuang』 首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop 一.写在前面 如果你前面两篇文章掌握了,说明你已经入门了. ...
- Mavlink协议概要
转:http://blog.csdn.net/luckpl/article/details/52608868#mavlink协议简介 Mavlink协议简介 Mavlink协议简介 一Mavlink协 ...
- Mavlink协议(第二版)
文章目录 协议简介 一.Mavlink协议 主要特点 二.数据结构 不兼容标志 (MAVLink 2) 兼容性标志 (MAVLink 2) 有效载荷格式 MAVLink 2 的数据包格式 三.航点协议 ...
- 一、Mavlink协议
一.Mavlink协议 MAVLink通讯协议是一个为微型飞行器设计的非常轻巧的.只由头文件构成的信息编组库.它可以通过串口非常高效地封装C结构数据,并将这些数据包发送至地面控制站.该协议被PX4, ...
- mavlink协议详解_MAVLink通讯协议在STM32上移植,并自定义协议
mavlink全称是(Micro Air Vehicle Message Marshalling Library),从名字可以看出,mavlink是主要面向飞控的一种开源通信协议.因此它默认定义了很多 ...
- MAVLink协议详解
MAVLink是为微型飞行器MAV(Micro Air Vehicle)设计的(LGPL)开源的通讯协议.是无人飞行器和地面站(Ground Control Station ,GCS)之间,以及无人飞 ...
- Mavlink协议分析
阿木社区:转载注意出处 http://www.amovauto.com Pixhawk/APM都是采用MAVLINK协议实现的飞控的数据链路传输.先简单介绍下mavlink协议.Mavlink协议最早 ...
- mavlink协议详解_MAVLink学习之路05_ MAVLink应用编程接口分析
描述 MAVLink应用编程主要内容 2.1 发送和接收说明 利用MAVLink通信协议进行编程,主要实现的功能就是: 1.发送端 将需要发送的数据(如:SysState, BatVol),添加MAV ...
- mavlink协议_MAVLink学习之路05_MAVLink应用编程接口分析
说明: 本文原创作者『strongerHuang』 首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop 一.写在前面 前面写的几篇文章你掌握了,说明你离成功很近了 ...
最新文章
- python运行完不能显示图_Python Pygame无法正确显示图像
- 使用Docker搭建WordPress博客(三)nginx镜像制作
- python如何进行大到小排序_Python3基础 list sort 从小(大)到大(小)排序
- shardingsphere启动的时候报错Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required
- 自然语言处理中的语言模型预训练方法
- boost::mpi模块sendrecv() 操作的测试
- 比特币交易手续费_投资人跑步进军比特币,OKEx交易手续费最高打6折
- Javascript 检测 页面是否在iframe中
- 2017-2018-1 20155227 《信息安全系统设计基础》第四周学习总结
- 你需要简单了解JVM中的内存长什么样子
- 抢红包案例分析以及代码实现(一) 侵立删
- 解决实现虚拟机win10与主机文件的共享问题
- php 横屏和竖屏,面试问题,视频横屏与竖屏的设计差异?我是这样回答的
- 猛文:关于中国歼20气动性能…
- 流媒体协议RTP、RTCP、H264详解
- 短视频sdk:选择一个靠谱的短视频SDK 你需要了解这些
- FFmpeg获取视频的旋转角度
- 实操:基于LNMP搭建zabbix监控
- 我的博客园博客开通咯(qyl)
- 【比赛回顾】广工2020程序设计初赛C-秋夜hard
热门文章
- django解决借用Model使用数据库时报错 AttributeError: Manager isn‘t accessible via xxxxxModel instances
- vue 文件转换二进制_Vue利用Blob下载原生二进制数组文件
- android 相机应用程序,2020年最佳Android相机的应用程序
- arcgis server mysql_ArcGIS Server 10.1发布要素服务时遇到的数据库注册问题总结 (二)...
- 未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral,解决
- 省选专练【POI2015】Podzial naszyjnika
- 微信小程序开发-微信登陆流程
- BZOJ 2763: [JLOI2011]飞行路线 【SPFA】
- 响应在此上下文中不可用
- Linux内存之Cache