1准备材料,

首先准备一个带串口的stm32程序(这里选用整点原子的官方串口例程这里自己去找不讲)作者:恒久力行 QQ:624668529,然后去mavlink官网下载mavlink源码,这里重点讲解这里

a.进入mavlink官网(http://qgroundcontrol.org/mavlink/start),下拉到MAVLink Code and Generator如下图,得到mavlink源码有多种途径,这里选取用python生成。即点击MAVLink Generator (C/C++, Python)
    
 b.然后进入如下界面,点击网址,下面是生成的方法和步骤都写有
c.然后点击clone and downed里面的download zip 即可下载
下载好后解压,然后直接运行mavlink-master里面的mavgenerate.py(python环境自己安装,这里不讲)
然后进入如下界面

 点击第一个browse选择message_definitions文件夹里面的v1.0里面的common.xml
然后自己选择输出路径我这里选的新建文件夹
language选择C
protocol选择1.0
然后直接点generate生成

 
到此材料准备完毕。
 
2开始真正的移植工作
a.在串口实验里新建一个MAVLINK文件夹,并将刚才生成的文件拷贝过来,如图
    
 打开工程新建分组,将所有拷贝过来的文件和头文件目录添加好,具体这里就不讲了,添加好后如图
    
 b.在main函数中添加#include "mavlink.h"如下
   

 然后编译
"..\OBJ\USART.axf" - 30 Error(s), 17 Warning(s).
一个一个解决。
 
错误一:
..\MAVLINK\common\../mavlink_types.h(53): error:  #20: identifier "pack" is undefined
解决方法:
将mavlink_types.h中
  1. #define MAVPACKED( __Declaration__ ) __pragma( pack(push,1)) __Declaration__ __pragma( pack(pop))
改为
  1. #define MAVPACKED( __Declaration__ ) __Declaration__
这里不使用对齐字节了,直接用也是一样的。
编译后:
"..\OBJ\USART.axf" - 30 Error(s), 7 Warning(s).
 
错误二:
..\MAVLINK\common\../mavlink_types.h(54): error:  #3092: anonymous unions are only supported in --gnu mode, or when enabled with #pragma anon_unions
解决方法:
根据提示信息在mavlink_types.h的前面加入#pragma anon_unions
编译后:
"..\OBJ\USART.axf" - 30 Error(s), 8 Warning(s).
 
错误三:
..\MAVLINK\common\../checksum.h(34): warning:  #260-D: explicit type is missing ("int" assumed)
包括后面很多错误都有共同点,指向有inline的行,这里是因为mdk中无法识别inline
解决方法:
在checksum.h加入一行代码定义inline
  1. #defineinline __INLINE

 
编译后:
"..\OBJ\USART.axf" - 4 Error(s), 195 Warning(s).
 
错误四:
..\MAVLINK\common\../mavlink_conversions.h(167): error:  #268: declaration may not appear after executable statement in block
解决方法:
指向定义的变量,将变量的定义放到函数的最前端(四个错误都是这种错误)
以前mavlink_conversions.h的代码
  1. MAVLINK_HELPER void mavlink_dcm_to_quaternion(constfloat dcm[3][3],float quaternion[4])
  2. {
  3. float tr = dcm[0][0]+ dcm[1][1]+ dcm[2][2];
  4. if(tr >0.0f){
  5. float s = sqrtf(tr +1.0f);
  6. quaternion[0]= s *0.5f;
  7. s =0.5f/ s;
  8. quaternion[1]=(dcm[2][1]- dcm[1][2])* s;
  9. quaternion[2]=(dcm[0][2]- dcm[2][0])* s;
  10. quaternion[3]=(dcm[1][0]- dcm[0][1])* s;
  11. }else{
  12. /* Find maximum diagonal element in dcm
  13. * store index in dcm_i */
  14. int dcm_i =0;
  15. int i;
  16. for(i =1; i <3; i++){
  17. if(dcm[i][i]> dcm[dcm_i][dcm_i]){
  18. dcm_i = i;
  19. }
  20. }
  21. int dcm_j =(dcm_i +1)%3;
  22. int dcm_k =(dcm_i +2)%3;
  23. float s = sqrtf((dcm[dcm_i][dcm_i]- dcm[dcm_j][dcm_j]-
  24. dcm[dcm_k][dcm_k])+1.0f);
  25. quaternion[dcm_i +1]= s *0.5f;
  26. s =0.5f/ s;
  27. quaternion[dcm_j +1]=(dcm[dcm_i][dcm_j]+ dcm[dcm_j][dcm_i])* s;
  28. quaternion[dcm_k +1]=(dcm[dcm_k][dcm_i]+ dcm[dcm_i][dcm_k])* s;
  29. quaternion[0]=(dcm[dcm_k][dcm_j]- dcm[dcm_j][dcm_k])* s;
  30. }
  31. }
更改后mavlink_conversions.h的代码
  1. MAVLINK_HELPER void mavlink_dcm_to_quaternion(constfloat dcm[3][3],float quaternion[4])
  2. {
  3. int dcm_j,dcm_k;
  4. float s;
  5. float tr = dcm[0][0]+ dcm[1][1]+ dcm[2][2];
  6. if(tr >0.0f){
  7. float s = sqrtf(tr +1.0f);
  8. quaternion[0]= s *0.5f;
  9. s =0.5f/ s;
  10. quaternion[1]=(dcm[2][1]- dcm[1][2])* s;
  11. quaternion[2]=(dcm[0][2]- dcm[2][0])* s;
  12. quaternion[3]=(dcm[1][0]- dcm[0][1])* s;
  13. }else{
  14. /* Find maximum diagonal element in dcm
  15. * store index in dcm_i */
  16. int dcm_i =0;
  17. int i;
  18. for(i =1; i <3; i++){
  19. if(dcm[i][i]> dcm[dcm_i][dcm_i]){
  20. dcm_i = i;
  21. }
  22. }
  23. dcm_j =(dcm_i +1)%3;
  24. dcm_k =(dcm_i +2)%3;
  25. s = sqrtf((dcm[dcm_i][dcm_i]- dcm[dcm_j][dcm_j]-
  26. dcm[dcm_k][dcm_k])+1.0f);
  27. quaternion[dcm_i +1]= s *0.5f;
  28. s =0.5f/ s;
  29. quaternion[dcm_j +1]=(dcm[dcm_i][dcm_j]+ dcm[dcm_j][dcm_i])* s;
  30. quaternion[dcm_k +1]=(dcm[dcm_k][dcm_i]+ dcm[dcm_i][dcm_k])* s;
  31. quaternion[0]=(dcm[dcm_k][dcm_j]- dcm[dcm_j][dcm_k])* s;
  32. }
  33. }
 
以前mavlink_helpers.h的代码
  1. MAVLINK_HELPER uint16_t mavlink_msg_to_send_buffer(uint8_t*buffer,constmavlink_message_t*msg)
  2. {
  3. memcpy(buffer,(constuint8_t*)&msg->magic, MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  4. uint8_t*ck = buffer +(MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  5. ck[0]=(uint8_t)(msg->checksum &0xFF);
  6. ck[1]=(uint8_t)(msg->checksum >>8);
  7. return MAVLINK_NUM_NON_PAYLOAD_BYTES +(uint16_t)msg->len;
  8. }
更改后mavlink_helpers.h的代码
  1. MAVLINK_HELPER uint16_t mavlink_msg_to_send_buffer(uint8_t*buffer,constmavlink_message_t*msg)
  2. {
  3. uint8_t*ck;
  4. memcpy(buffer,(constuint8_t*)&msg->magic, MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  5. ck = buffer +(MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  6. ck[0]=(uint8_t)(msg->checksum &0xFF);
  7. ck[1]=(uint8_t)(msg->checksum >>8);
  8. return MAVLINK_NUM_NON_PAYLOAD_BYTES +(uint16_t)msg->len;
  9. }
编译后:
"..\OBJ\USART.axf" - 0 Error(s), 195 Warning(s).
 
解决所有警告的方法:
将protocol.h里面的旧代码
  1. #define _MAV_RETURN_char(msg, wire_offset)(constchar)_MAV_PAYLOAD(msg)[wire_offset]
  2. #define_MAV_RETURN_int8_t(msg, wire_offset)(constint8_t)_MAV_PAYLOAD(msg)[wire_offset]
  3. #define_MAV_RETURN_uint8_t(msg, wire_offset)(constuint8_t)_MAV_PAYLOAD(msg)[wire_offset]
去掉const,改为
  1. #define _MAV_RETURN_char(msg, wire_offset)(constchar)_MAV_PAYLOAD(msg)[wire_offset]
  2. #define_MAV_RETURN_int8_t(msg, wire_offset)(int8_t)_MAV_PAYLOAD(msg)[wire_offset]
  3. #define_MAV_RETURN_uint8_t(msg, wire_offset)(uint8_t)_MAV_PAYLOAD(msg)[wire_offset]
编译后:
"..\OBJ\USART.axf" - 0 Error(s), 0 Warning(s).
 
3开始更改底层串口代码
待续。。。
作者:恒久力行 QQ:624668529
这里有移植的完整教程,两个教程参考着看吧附上网址http://www.cnblogs.com/lovechen/p/5809709.html
 

 

移植mavlink协议到STM32详细教程的更多相关文章

  1. 移植mavlink到stm32详细教程,后面附快速移植方法

    一:准备材料: mavlink源码 stm32串口程序    1.mavlink源码:        a.进入mavlink官网(http://qgroundcontrol.org/mavlink/s ...

  2. 移植MAVLINK到STM32详细教程之三

    在前面教程的基础上继续移植优化,之前的没有加缓冲区,没有接收函数功能,这里进行统一的讲解                            作者:恒久力行  qq:624668529 缓冲区对于接 ...

  3. Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程

    Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程 一:前言 最近手上压了一块米联客的Miz7035,一块xilinx zynq-7000系列的开发板,想着正好学习一下linu ...

  4. mavlink协议移植问题

    mavlink协议移植问题 mavlink源代码是一个代码库,使用的时候只需要将mavlink.h头文件包含到工程项目中即可. mavlink通信协议是无状态的连接,一般采用心跳消息跟踪系统是否存在. ...

  5. git详细教程

    Table of Contents 1 Git详细教程 1.1 Git简介 1.1.1 Git是何方神圣? 1.1.2 重要的术语 1.1.3 索引 1.2 Git安装 1.3 Git配置 1.3.1 ...

  6. GitHub详细教程(转载)

    1 Git详细教程 1.1 Git简介 1.1.1 Git是何方神圣? 1.1.2 重要的术语 1.1.3 索引 1.2 Git安装 1.3 Git配置 1.3.1 用户信息 1.3.2 高亮显示 1 ...

  7. GitHub详细教程

    GitHub详细教程 Table of Contents 1 Git详细教程 1.1 Git简介 1.1.1 Git是何方神圣? 1.1.2 重要的术语 1.1.3 索引 1.2 Git安装 1.3 ...

  8. 【原创】车载实时路况信息接收终端移植于Smart210开发板 --- 综合教程

    [原创]车载实时路况信息接收终端移植于Smart210开发板 --- 综合教程 所用工具: windows电脑 Ubuntu12.04 Smart210开发板 4g以上SD卡 U盘 步骤: 1.    ...

  9. Ymodem协议(参考STM32)

    相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootload设计.所以就仔细的去了研究了一翻.以前都是用的stm32官 ...

随机推荐

  1. 第三篇elasticsearch分布式安装

    elasticSearch 分布式安装 1.在elasticSearch下的config下elasticsearch.yml文件最后一行添加注意 一定要加空格在:后面cluster.name: wal ...

  2. 【eclipse】Eclipse安装插件支持jQ…

    [eclipse]Eclipse安装插件支持jQuery智能提示 最近工作中用到jQuery插件,需要安装eclipse插件才能支持jQuery智能提示,在网上搜索了一下,常用的有三个插件支持jQue ...

  3. python处理大文件——文件流处理

    最近处理一份1000G+的大文件,直接loading进内存不可能,只能分片读取.文件介绍如下: 该文件是一份压缩的比对后文件(sam文件),该文件由很多细小的结构单元组成,一个结构如下: 两种方法: ...

  4. 【机器学习】关联规则挖掘(二):频繁模式树FP-growth

    Apriori算法的一个主要瓶颈在于,为了获得较长的频繁模式,需要生成大量的候选短频繁模式.FP-Growth算法是针对这个瓶颈提出来的全新的一种算法模式.目前,在数据挖掘领域,Apriori和FP- ...

  5. vue.js基础学习(1)

    一:v-cloak:解决浏览器闪烁,编译过程中不会显示,直到编译结束才显示. 用法:[v-cloak] { display: none;} <div v-cloak> {{ message ...

  6. 7.XXEinjector:一款功能强大的自动化XXE注射工具

    今天给大家介绍的是一款名叫XXEinjector的漏洞利用工具,XXEinjector是一款基于Ruby的XXE注入工具, 它可以使用多种直接或间接带外方法来检索文件.其中,目录枚举功能只对Java应 ...

  7. 使用form 组件写一个用户注册,并用 bootstrap渲染

    需求:使用form组件,写一个用户注册系统,包含用户名, 密码, 确认密码,手机号,性别,爱好,注册.并用bootsrap渲染,成果如下: 首先创建一个django 项目.然后在连接pymysql数据 ...

  8. MySQL(进阶)

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( SEL ...

  9. Note: Bimodal Content Defined Chunking for Backup Streams

    CDC算法给出了一个chunk的大小的最小值.最大值.平均值的界定. Method Using chunk existence information breaking-apart algorithm ...

  10. Yaf + Smarty 整合笔记

    Yaf真的是太简单了,简单到使用mvc的时候在view里面需要手写php脚本.因此考虑整合一下smarty模板引擎.随心所欲也正是yaf的魅力 Yaf 安装 这里简单说一下yaf的安装,已经是非常无脑 ...