标题: MavLink协议-编码与解码(STM32源程序) [打印本页]

作者: xiaolibo    时间: 2019-9-1 18:49
标题: MavLink协议-编码与解码(STM32源程序)
MavLink协议(开发笔记)

        本例程在探索者串口实验基础上面修改。如果您的硬件平台是探索者,可以直接下载使用。
一.MavLink编码(数据封包)
        数据封包:将所需要发送的数据包装成MavLink协议字节流,通过串口发送出去。
        下面是发送心跳包的Demo
void Mavlink_TX_Heartbeat(void){    //消息包结构   
mavlink_message_t MSG;    //调用mavlink_msg_heartbeat_pack函数将数据封包,传入到消息结构中。   
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    //临时缓存区   
uint8_t  MAVLink_Buf[6+9+2];        //调用mavlink_msg_to_send_buffer函数将消息结构里面的数据以字节流的方式保存到缓存区   
len = mavlink_msg_to_send_buffer(MAVLink_Buf, &MSG);    //调用MAV_USART_SendNByte函数发送缓存区里面的数据    MAV_USART_SendNByte(MAVLink_Buf, len);//(需要自己编写)}
如果正常的话,就如下图所示。



        图中就是心跳包数据,一帧数据有17位。

        在ardupilotmega文件里面还有大量的数据封包函数,
比如:
        mavlink_msg_sys_status_pack                  系统状态
        mavlink_msg_battery_status_pack            电池状态
        mavlink_msg_highres_imu_pack               IMU
        mavlink_msg_global_position_int_pack    定位
        等等。

二.MavLink解码(数据解析)
        数据解码:将接收到的数据转换成字符的形式显示出来。
        下面是解码心跳包的Demo
//状态uint8_t ret = 0;//消息结构mavlink_message_t msg;void USART1_IRQHandler(void)                  //串口1中断服务程序{    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断   
{        uint8_t data = USART_ReceiveData(USART1);//(USART1->DR);  //读取接收到的数据        //调用mavlink_parse_char函数来判断数据,数据接收完成,返回MAVLINK_FRAMING_OK        ret = mavlink_parse_char(MAVLINK_COMM_3, data, &msg, &status);    }}
void MAVLinkRcv_Handler(mavlink_message_t MAVLinkMsg){  //心跳包结构  mavlink_heartbeat_t current_messages;    if(MAVLinkMsg.msgid==MAVLINK_MSG_ID_HEARTBEAT)//消息ID为心跳包
  {    //调用mavlink_msg_heartbeat_decode函数解码心跳包    mavlink_msg_heartbeat_decode(&MAVLinkMsg, ¤t_messages);    //显示心跳包数据(需要自己编写)    SHOW_HEARTBEAT(MAVLinkMsg, current_messages);  }}
int main(void){   
init();   
while(1)    {        if( MAVLINK_FRAMING_OK == ret )      
  {            //接收成功            //解码           
MAVLinkRcv_Handler(msg);           
ret = 0;          }            
else /*TODO*/ ;        }}  
如果正常的话,就如下图所示。



        图中就是已经解码后的心跳包数据。具体的含义可以自行去官网了解,这里就不过多的介绍。

        在ardupilotmega文件里面还有大量的数据解码函数,
比如:
        mavlink_msg_battery_status_decode          系统状态
        mavlink_msg_battery_status_decode          电池状态
        mavlink_msg_highres_imu_decode             IMU
        mavlink_msg_global_position_int_decode  定位
        等等。

        以上就是MavLink协议的心跳包编码与解码实现

全部程序51hei下载地址:
MacLink协议.7z (678.23 KB, 下载次数: 102)





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1