KEIL工程移植
本文利用STM32F4的控制板的PX4控制板,并且利用cubeMX进行工程配置来实现MAVLink的移植。最终实现PX4控制板与QGC上位机的通信,以此来验证MAVLink是否成功移植。
1.因为转换的C语言代码都是以.h的文件夹实现的,所以把上图的文件包含到工程路径中,并且包含如下的头文件即可包含全部实现的
#include
接着利用cubeMx进行串口的配置,我们使用中断DMA接收与普通轮询模式发送。不是本文重点,不做描述,可百度,亦可有兴趣观看视频。
接着我们可以在keil工程里面全局编译一下,会发现好多的错误。这个错误跟编译器有关。一种方式是直接修改每一个错误,可以自行百度“mavlink移植 ”;当然还有一种方法,是在工程配置中加入如下配置:
--no_strict --gnu
目的是想让MAVLink这段代码采用gun的格式进行编译,但是要注意其他的代码需要保证是使用的keil的默认编译器__CC_ARM进行编译。再次编译会发现没有错误。
2.接着就是实现发送、接收数据的底层函数。
C MAVLink库的实现的多通道的数据流,同样的程序可以在不同的独立通道流上进行传输。如果只存在一个MAVLink数据流,channel 0默认被用来进行数据传输(MAVLINK_COMM_0)
接收数据的处理函数是在MAVLink的 mavlink_helpers.h:mavlink_parse_char()
函数里面实现的。这个函数实际上需要在每次接收到一个字节数据的时候调用它来解析的信息,直到一个完整的数据包被解析完成。
发送数据可以用mavlink_msg_*_pack()
这些函数,然后调用mavlink_helpers.h:mavlink_msg_to_send_buffer()
进行序列化。同时,为了方便,MAVLink为每一种类型的传输数据都定义了一个函数,例如mavlink_msg_raw_imu_send
。想要发送IMU数据调用这个函数即可。
那我们移植需要关系的是这些函数最后是调用什么的底层硬件接口进行真正的数据传送的。其实最后是调用的_mavlink_send_uart(mavlink_channel_t chan, const char *buf, uint16_t len)
这个函数。在这个函数里面有2种底层方式进行数据传送:多字节和单字节。我们来实现多字节。
首先,定义宏
#define MAVLINK_USE_CONVENIENCE_FUNCTIONS
// 移植必须要设定这个宏,详见代码
#define MAVLINK_SEND_UART_BYTES mavlink_send_uart_bytes
//mavlink_send_uart_bytes是我们用户自己需要实现的底层代码。
void mavlink_send_uart_bytes(mavlink_channel_t chan, const uint8_t *ch, int length)
{
HAL_UART_Transmit(&huart8, (uint8_t *)ch, length, 2000);
}
3.到这边基本移植都差不多了。本文在main中做了一个mavlink_test()
测试函数用于发数据给上位机,
void mavlink_test(void)
{
static uint16_t test_count=0;
mavlink_message_t lastmsg;
test_count++;
//5hz
if((test_count%100)==0)
{
mavlink_test_heartbeat2(1,1,&lastmsg);
}
if((test_count%50)==0)
{
mavlink_test_raw_imu2(1,1,&lastmsg);
}
}
同时利用ringbuffer接收数据,然后在main中实时解析Loop_Mavlink_Parse()
上位机发送过来的数据。
```
void Loop_Mavlink_Parse(void)
{
if(Mavlink_RB_IsOverFlow())
{
Mavlink_RB_Clear();
}
while(Mavlink_RB_HasNew())
{
uint8_t read = Mavlink_RB_Pop();
if(mavlink_parse_char(MAVLINK_COMM_0, read, &msg, &status))
{
//信号处理函数
Mavlink_Msg_Handle(msg);
//printf("Received message with ID %d, sequence: %d from component %d of system %d", msg.msgid, msg.seq, msg.compid, msg.sysid);
}
}
}
```
最后实际测试移植成功。