找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6209|回復(fù): 0
收起左側(cè)

MavLink協(xié)議-編碼與解碼(STM32源程序)

[復(fù)制鏈接]
ID:235201 發(fā)表于 2019-9-1 18:49 | 顯示全部樓層 |閱讀模式
MavLink協(xié)議(開發(fā)筆記)

        本例程在探索者串口實(shí)驗(yàn)基礎(chǔ)上面修改。如果您的硬件平臺是探索者,可以直接下載使用。
一.MavLink編碼(數(shù)據(jù)封包)
        數(shù)據(jù)封包:將所需要發(fā)送的數(shù)據(jù)包裝成MavLink協(xié)議字節(jié)流,通過串口發(fā)送出去。
        下面是發(fā)送心跳包的Demo
void Mavlink_TX_Heartbeat(void){    //消息包結(jié)構(gòu)   
mavlink_message_t MSG;    //調(diào)用mavlink_msg_heartbeat_pack函數(shù)將數(shù)據(jù)封包,傳入到消息結(jié)構(gòu)中。   
uint16_t len = mavlink_msg_heartbeat_pack(                     
0x01, //system_id                       0x01, //component_id                       &MSG, //msg                       0x02, //type                       0x03, //autopilot                       0x51, //base_mode                       0x00, //custom_mode                       0x03);//system_status    //臨時緩存區(qū)   
uint8_t  MAVLink_Buf[6+9+2];        //調(diào)用mavlink_msg_to_send_buffer函數(shù)將消息結(jié)構(gòu)里面的數(shù)據(jù)以字節(jié)流的方式保存到緩存區(qū)   
len = mavlink_msg_to_send_buffer(MAVLink_Buf, &MSG);    //調(diào)用MAV_USART_SendNByte函數(shù)發(fā)送緩存區(qū)里面的數(shù)據(jù)    MAV_USART_SendNByte(MAVLink_Buf, len);//(需要自己編寫)}
如果正常的話,就如下圖所示。

心跳包數(shù)據(jù).png

        圖中就是心跳包數(shù)據(jù),一幀數(shù)據(jù)有17位。

        在ardupilotmega文件里面還有大量的數(shù)據(jù)封包函數(shù),
比如:
        mavlink_msg_sys_status_pack                  系統(tǒng)狀態(tài)
        mavlink_msg_battery_status_pack            電池狀態(tài)
        mavlink_msg_highres_imu_pack               IMU
        mavlink_msg_global_position_int_pack    定位
        等等。

二.MavLink解碼(數(shù)據(jù)解析)
        數(shù)據(jù)解碼:將接收到的數(shù)據(jù)轉(zhuǎn)換成字符的形式顯示出來。
        下面是解碼心跳包的Demo
//狀態(tài)uint8_t ret = 0;//消息結(jié)構(gòu)mavlink_message_t msg;void USART1_IRQHandler(void)                  //串口1中斷服務(wù)程序{    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中斷   
{        uint8_t data = USART_ReceiveData(USART1);//(USART1->DR);  //讀取接收到的數(shù)據(jù)        //調(diào)用mavlink_parse_char函數(shù)來判斷數(shù)據(jù),數(shù)據(jù)接收完成,返回MAVLINK_FRAMING_OK        ret = mavlink_parse_char(MAVLINK_COMM_3, data, &msg, &status);    }}
void MAVLinkRcv_Handler(mavlink_message_t MAVLinkMsg){  //心跳包結(jié)構(gòu)  mavlink_heartbeat_t current_messages;    if(MAVLinkMsg.msgid==MAVLINK_MSG_ID_HEARTBEAT)//消息ID為心跳包
  {    //調(diào)用mavlink_msg_heartbeat_decode函數(shù)解碼心跳包    mavlink_msg_heartbeat_decode(&MAVLinkMsg, ¤t_messages);    //顯示心跳包數(shù)據(jù)(需要自己編寫)    SHOW_HEARTBEAT(MAVLinkMsg, current_messages);  }}
int main(void){   
init();   
while(1)    {        if( MAVLINK_FRAMING_OK == ret )      
  {            //接收成功            //解碼           
MAVLinkRcv_Handler(msg);           
ret = 0;          }            
else /*TODO*/ ;        }}  
如果正常的話,就如下圖所示。

心跳包解析后的數(shù)據(jù).png

        圖中就是已經(jīng)解碼后的心跳包數(shù)據(jù)。具體的含義可以自行去官網(wǎng)了解,這里就不過多的介紹。

        在ardupilotmega文件里面還有大量的數(shù)據(jù)解碼函數(shù),
比如:
        mavlink_msg_battery_status_decode          系統(tǒng)狀態(tài)
        mavlink_msg_battery_status_decode          電池狀態(tài)
        mavlink_msg_highres_imu_decode             IMU
        mavlink_msg_global_position_int_decode  定位
        等等。

        以上就是MavLink協(xié)議的心跳包編碼與解碼實(shí)現(xiàn)

全部程序51hei下載地址:
MacLink協(xié)議.7z (678.23 KB, 下載次數(shù): 102)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表