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ù),一幀數(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*/ ; }}
如果正常的話,就如下圖所示。
圖中就是已經(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)
2019-9-2 04:32 上傳
點(diǎn)擊文件名下載附件
|