找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5124|回复: 0
收起左侧

MavLink协议-编码与解码(STM32源程序)

[复制链接]
ID:235201 发表于 2019-9-1 18:49 | 显示全部楼层 |阅读模式
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);//(需要自己编写)}
如果正常的话,就如下图所示。

心跳包数据.png

        图中就是心跳包数据,一帧数据有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*/ ;        }}  
如果正常的话,就如下图所示。

心跳包解析后的数据.png

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

        在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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表