前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mavlink协议原理_mavlink协议长度

mavlink协议原理_mavlink协议长度

作者头像
全栈程序员站长
发布2022-09-20 13:53:56
5150
发布2022-09-20 13:53:56
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

参考https://cloud.tencent.com/developer/news/48344

https://www.cnblogs.com/lovechen/p/5801679.html

https://www.cnblogs.com/lovechen/p/5809709.htm

https://www.jianshu.com/p/e57aa664103f

https://www.e-learn.cn/content/qita/1017591

是一种用于飞行器上的轻量级成熟通信协议,与很多自定的协议相比,它的开发难度非常小,有现成的配置工具,可直接生成MSG代码(简单来说,就是生成对应的函数接口供你直接调用即可),直接调用几个相应的函数接口即可,不需要自己封装、解析等;突出的优点在于配置调用比较简单,字节流发送buf长度sendbuf[6+n+2].

mavlink协议原理_mavlink协议长度
mavlink协议原理_mavlink协议长度

其中0到149为公共消息ID(飞控系统共有消息,一般不建议用于自定义)。而150到240为用于自定义消息的ID范围。

1.配置

MAVLink通过xml文件,配置信息(MSG),这个MSG可以理解成我们需要接收或者发送的数据变量。比如:运动控制包含速度距离,xml配置如下:

mavlink协议原理_mavlink协议长度
mavlink协议原理_mavlink协议长度

2.通过生成代码

从官网下载mavlink(git clone https://github.com/mavlink/mavlink.git)

mavlink官网(http://qgroundcontrol.org/mavlink/start),下拉到MAVLink Code and Generator如下图,得到mavlink源码有多种途径,这里选取用python生成。即点击MAVLink Generator (C/C++, Python)

git clone https://github.com/mavlink/mavlink mavlink-generator

或者用PYTHON进行安装 pip install pymavlink,切换到mavlink-master目录下然后运行python mavegenerate.py ,然后修改xml并生成C库

mavlink协议原理_mavlink协议长度
mavlink协议原理_mavlink协议长度

3.调用代码

代码生成,只需要简单调用两个函数接口即可:

发送:调用两个函数即可:

mavlink_msg_motion_pack():封包函数接口;参数为:sysid,comid,&buf,参数值1,2,。。。n)

mavlink_msg_to_send_buffer:转换成发送的BUF

接收解析:

1调用mavlink_parse_char函数来判断数据是否接收完成(完成标志:MAVLINK_FRAMING_OK)

2 根据接收完成标志对数据进行解析和调用。

代码语言:javascript
复制
 1 //状态uint8_t ret = 0;  2 //消息结构  3 mavlink_message_t msg;  4 void USART1_IRQHandler(void) //串口1中断服务程序  5 {  6 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断   7  {  8 uint8_t data = USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据 //调用mavlink_parse_char函数来判断数据,数据接收完成,返回MAVLINK_FRAMING_OK   9 ret = mavlink_parse_char(MAVLINK_COMM_3, data, &msg, &status); 10  } 11 } 12 void MAVLinkRcv_Handler(mavlink_message_t MAVLinkMsg) 13 { //心跳包结构  14  mavlink_heartbeat_t current_messages; 15 if(MAVLinkMsg.msgid==MAVLINK_MSG_ID_HEARTBEAT)//消息ID为心跳包 16 { //调用mavlink_msg_heartbeat_decode函数解码心跳包  17 mavlink_msg_heartbeat_decode(&MAVLinkMsg, current_messages); //显示心跳包数据(需要自己编写)  18  SHOW_HEARTBEAT(MAVLinkMsg, current_messages); 19  } 20 } 21 int main(void) 22 { 23  init(); 24 while(1) 25  { 26 if( MAVLINK_FRAMING_OK == ret ) 27  { 28 //接收成功 //解码  29  MAVLinkRcv_Handler(msg); 30 ret = 0; 31  } 32 else 33  { 34 /*TODO*/ 35  } 36  } 37 }

View Code

4编译排错:

keil工程里面全局编译一下,会发现好多的错误。这个错误跟编译器有关。一种方式是直接修改每一个错误,可以自行百度“mavlink移植 ”;当然还有一种方法,是在工程配置中加入如下配置:

--no_strict --gnu

目的是想让MAVLink这段代码采用gun的格式进行编译,但是要注意其他的代码需要保证是使用的keil的默认编译器__CC_ARM进行编译。再次编译会发现没有错误。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/167269.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档