Mavlink 协议硬解析主要代码


  1744人阅读  评论(1)  收藏  举报
[cpp]  view plain copy
  1. int MAVLinkProtocol::ParseMsg(BYTE arMsgBuf[], MSGVALUE *pMavMsg, CString &strMsgText)  
  2. {  
  3.     // Function    :   
  4.     // Parameters  : arMsgBuf - 为完整的 mavlink msg 缓冲区, 从 0xFE 开始到 最后一个校验字节(CKB)  
  5.     // Return value:   
  6.     // Remark      :   
  7.   
  8.     int  i, nOfst, nLenMaxPayload;  
  9.     BYTE nMsgID;  
  10.     char szTmpName[LEN_MSGNM];  
  11.   
  12.     char szStatusTxt[MAVLINK_MSG_ID_STATUSTEXT_LEN];  
  13.     char szValueID[MAVLINK_MSG_PARAM_VALUE_FIELD_PARAM_ID_LEN];  
  14.     CString strTmp, strUnicodeTmp;  
  15.   
  16.   
  17.     i = 0;  
  18.     nOfst = 0;  
  19.   
  20.     if(arMsgBuf[0] != 0xfe)  
  21.         return -1;  
  22.   
  23.     nMsgID = arMsgBuf[5];  
  24.     ASSERT(nMsgID < 256);  
  25.   
  26.     nLenMaxPayload = arMsgBuf[1];  
  27.     ASSERT(nLenMaxPayload > 0 && nLenMaxPayload < MAVLINK_MAX_PAYLOAD_LEN);  
  28.   
  29.   
  30.     // 获取 message 字段个数  
  31.     pMavMsg ->nFieldCnts = g_arMsgInfo[nMsgID].num_fields;  
  32.   
  33.     // 获取 message 名称  
  34.     memset(szTmpName, 0x00, sizeof(szTmpName));  
  35.     if(strlen(g_arMsgInfo[nMsgID].name) < LEN_MSGNM)  
  36.         strcpy(szTmpName,  g_arMsgInfo[nMsgID].name);  
  37.     else  
  38.         strncpy(szTmpName, g_arMsgInfo[nMsgID].name, LEN_MSGNM - 1);  
  39.       
  40.     strUnicodeTmp = AnsiStr2Unicode(szTmpName);  
  41.     if(strUnicodeTmp.GetLength() > LEN_MSGNM - 1)  
  42.         strUnicodeTmp = strUnicodeTmp.Left(LEN_MSGNM - 1);  
  43.     _tcscpy(pMavMsg ->szMsgName, strUnicodeTmp);  
  44.   
  45.       
  46.   
  47.     // 根据 g_arMsgInfo[] 获取并处理各字段信息  
  48.     for(i = 0; i < pMavMsg ->nFieldCnts; i++)  
  49.     {  
  50.         strUnicodeTmp = AnsiStr2Unicode((char *) g_arMsgInfo[nMsgID].fields[i].name);  
  51.           
  52.         if(strUnicodeTmp.GetLength() > LEN_FIELDNM - 1)  
  53.             strUnicodeTmp = strUnicodeTmp.Left(LEN_FIELDNM - 1);  
  54.           
  55.         _tcscpy(pMavMsg ->arField[i].szFieldNm, strUnicodeTmp);                              // Field Name  
  56.         pMavMsg ->arField[i].nFieldTyp = g_arMsgInfo[nMsgID].fields[i].type;             // Field Type  
  57.           
  58.         nOfst = g_arMsgInfo[nMsgID].fields[i].wire_offset;  
  59.   
  60.   
  61.         // 特殊消息的处理  
  62.         if(nMsgID == MAVLINK_MSG_ID_STATUSTEXT && i == 1)             
  63.         {  
  64.             memset(szStatusTxt, 0x00, sizeof(szStatusTxt));  
  65.             memcpy(szStatusTxt, (arMsgBuf + MAVLINK_NUM_HEADER_BYTES + 1), MAVLINK_MSG_ID_STATUSTEXT_LEN);      // 1 为 字符串位置相对载荷开始位置的偏移  
  66.             strMsgText = AnsiStr2Unicode(szStatusTxt);  
  67.         }  
  68.         else if(nMsgID == MAVLINK_MSG_ID_PARAM_VALUE && i == 3)  
  69.         {  
  70.             memset(szValueID, 0x00, sizeof(szValueID));  
  71.             memcpy(szValueID, (arMsgBuf + MAVLINK_NUM_HEADER_BYTES + 8), MAVLINK_MSG_PARAM_VALUE_FIELD_PARAM_ID_LEN);  
  72.             strMsgText = AnsiStr2Unicode(szValueID);  
  73.         }  
  74.         else if(nMsgID == MAVLINK_MSG_ID_PARAM_SET && i == 3)  
  75.         {  
  76.             memcpy(szValueID, (arMsgBuf + MAVLINK_NUM_HEADER_BYTES + 6), MAVLINK_MSG_PARAM_VALUE_FIELD_PARAM_ID_LEN);  
  77.             strMsgText = AnsiStr2Unicode(szValueID);  
  78.         }  
  79.         else  
  80.         {  
  81.             // 一般 mavlink msg 的处理  
  82.   
  83.             // 获取每个数值所存储的缓冲区  
  84.             if(g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_CHAR ||   
  85.                g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_UINT8_T ||   
  86.                g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_INT8_T)  
  87.             {  
  88.                 pMavMsg ->arField[i].arData[0] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst];  
  89.                 ASSERT(nOfst < nLenMaxPayload);  
  90.             }  
  91.             else if(g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_UINT16_T ||   
  92.                 g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_INT16_T)  
  93.             {  
  94.                 pMavMsg ->arField[i].arData[0] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst];  
  95.                 pMavMsg ->arField[i].arData[1] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 1];  
  96.                   
  97.                 ASSERT(nOfst + 1 < nLenMaxPayload);  
  98.             }  
  99.             else if(g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_UINT32_T ||   
  100.                 g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_INT32_T)  
  101.             {  
  102.                 pMavMsg ->arField[i].arData[0] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst];  
  103.                 pMavMsg ->arField[i].arData[1] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 1];  
  104.                 pMavMsg ->arField[i].arData[2] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 2];  
  105.                 pMavMsg ->arField[i].arData[3] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 3];  
  106.                   
  107.                 ASSERT(nOfst + 3 < nLenMaxPayload);  
  108.             }  
  109.             else if(g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_UINT64_T ||  
  110.                 g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_INT64_T)  
  111.             {  
  112.                 pMavMsg ->arField[i].arData[0] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst];  
  113.                 pMavMsg ->arField[i].arData[1] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 1];  
  114.                 pMavMsg ->arField[i].arData[2] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 2];  
  115.                 pMavMsg ->arField[i].arData[3] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 3];  
  116.                 pMavMsg ->arField[i].arData[4] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 4];  
  117.                 pMavMsg ->arField[i].arData[5] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 5];  
  118.                 pMavMsg ->arField[i].arData[6] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 6];  
  119.                 pMavMsg ->arField[i].arData[7] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 7];  
  120.                   
  121.                 ASSERT(nOfst + 7 < nLenMaxPayload);  
  122.             }  
  123.             else if(g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_FLOAT)           // 4 byte  
  124.             {  
  125.                 pMavMsg ->arField[i].arData[0] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst];  
  126.                 pMavMsg ->arField[i].arData[1] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 1];  
  127.                 pMavMsg ->arField[i].arData[2] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 2];  
  128.                 pMavMsg ->arField[i].arData[3] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 3];  
  129.                   
  130.                 ASSERT(nOfst + 3 < nLenMaxPayload);  
  131.             }  
  132.             else if(g_arMsgInfo[nMsgID].fields[i].type == MAVLINK_TYPE_DOUBLE)      // 8 byte  
  133.             {  
  134.                 pMavMsg ->arField[i].arData[0] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst];  
  135.                 pMavMsg ->arField[i].arData[1] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 1];  
  136.                 pMavMsg ->arField[i].arData[2] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 2];  
  137.                 pMavMsg ->arField[i].arData[3] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 3];  
  138.                 pMavMsg ->arField[i].arData[4] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 4];  
  139.                 pMavMsg ->arField[i].arData[5] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 5];  
  140.                 pMavMsg ->arField[i].arData[6] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 6];  
  141.                 pMavMsg ->arField[i].arData[7] = arMsgBuf[MAVLINK_NUM_HEADER_BYTES + nOfst + 7];   
  142.                   
  143.                 ASSERT(nOfst + 7 < nLenMaxPayload);  
  144.             }  
  145.             else   
  146.             {  
  147.                 TRACE(_T("\r\n> MAVLinkProtocol.ParseMsg - Unexpect field type: "));  
  148.                 TRACE(_T("\r\n> MAVLinkProtocol.ParseMsg - g_arMsgInfo[nMsgID].fields[i].type = %d"), g_arMsgInfo[nMsgID].fields[i].type);  
  149.             }  
  150.         }  
  151.     }  
  152.   
  153.     return nMsgID;  
  154. }  


相关结构的定义:

[cpp]  view plain copy
  1. struct FIELDSVALUE  
  2. {  
  3.     TCHAR   szFieldNm[LEN_FIELDNM];  
  4.     uint8_t nFieldTyp;  
  5.     BYTE    arData[8];                                      // 字段数值  
  6. };  
  7.   
  8. struct MSGVALUE  
  9. {  
  10.     TCHAR   szMsgName[LEN_MSGNM];  
  11.     uint8_t nFieldCnts;  
  12.       
  13.     FIELDSVALUE arField[MAVLINK_MAX_FIELDS];  
  14. };  


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

[cpp]  view plain copy
  1. static mavlink_message_info_t g_arMsgInfo[256] = MAVLINK_MESSAGE_INFO  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值