飞控与机载电脑的通信

飞控固件版本:v7.0
fcu_core版本:v2

飞控发送,机载电脑接收

  1. 确定要使用的数据类型

飞控和机载电脑之间使用mavlink协议进行通信,飞控底层程序和机载电脑的数据传输层程序都使用了mavlink的第三方库,第三方库自带多种数据类型供我们使用
在飞控中,我们可以在下面位置找到数据类型的mavlink_msg_xxx.h文件,下面以mavlink_msg_altitude.h为例。

Mcontroller->Third_Party->mavlink->common->mavlink_msg_xxx.h

图片

可以看到这个.h文件定义了一个结构体数据类型,这就是我们要定义新数据的工具,每一个数据位都有英文注释标明这个数据位的作用。

图片

.h文件向下滑动可以看到这个数据类型的编码函数,mavlink协议中任何数据需要进行编码之后才能进行发送,相应的在接收数据之后也要进行解码。
函数上方注释标明了各个入口参数的意义

图片

  1. 使用数据类型,填写并发送数据

我们确定好使用的数据类型之后,接着要确定发送这个数据的频率,我们飞控提供了几个固定频率的freertos任务函数,如下所示

heartbeat任务--1hz
maincontroller.cpp
maincontroller.cpp

send_mavlink_data --10hz
maincontroller.cpp
maincontroller.cpp

comm_send_callback --200hz
maincontroller.cpp
maincontroller.cpp

如果需要自定义频率就需要在freertos的任务函数里面更改osDelay的参数了

我们填写和发送数据可以仿照imu数据的填写和发送
freertos.c
freertos.c

其中mavlink_message_t是编码之后的完整数据包,对于每一个mavlink数据类型都是统一的。

  1. 机载电脑接收并解析数据

我们机载电脑可能和飞控通过串口连接,也可能通过网络连接,但在接收到数据之后,首先要将数据包解析出我们需要的数据
fcu_bridge_001.cpp
fcu_bridge_001.cpp

直接调用mavlink_parse_char函数将mav_buf_receive里面的数据解析到msg_received里面,然后就是对数据ID进行区分,再进行解码,最终得到各种原始数据。

机载电脑发送,飞控接收

跟上面的逻辑流程是一样的,下面是机载电脑选择数据类型的文件
fcu_bridge_001.cpp
fcu_bridge_001.cpp

机载电脑发送数据,都在fcu_bridge_00*.cpp中
fcu_bridge_001.cpp
fcu_bridge_001.cpp

飞控端接收解包数据也是一样的逻辑
maincontroller.cpp
maincontroller.cpp

example

这里我们挑选mavlink_msg_statustext.h文件里的statustext数据类型

mavlink_msg_statustext.h
mavlink_msg_statustext.h

maincontroller.h
maincontroller.h

机载电脑端
fcu_bridge_001.cpp
fcu_bridge_001.cpp

图片