电子产业一站式赋能平台

PCB联盟网

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

分享一种用于单片机串口的通信协议

[复制链接]

652

主题

652

帖子

8522

积分

高级会员

Rank: 5Rank: 5

积分
8522
发表于 昨天 17:21 | 显示全部楼层 |阅读模式
关注+星标公众,不错过精彩内容
作者 | strongerHuang
微信公众号 | strongerHuang

嵌入式开发过程中,UART串口是最常见的一种通信接口。
然而,市面上用于串口的通信协议非常之多,今天来分享一种用于单片机串口的通信协议:MAVLink,并讲述其在应用中的编程原理和思路。
关于MAVLink通信协议
MAVLink:Micro Air Vehicle Link,即微型飞行器连接通信协议,于2009年初由Lorenz Meier首次发布。

Mavlink协议是在串口通讯基础上的一种更高层的开源通讯协议。它是一种非常轻量级的通信协议,可以在简单的8位单片机上运行。它主要用于与无人机(以及板载无人机组件之间)进行通信。

主要特征
1.效率很高
MAVLink V1每帧最少只有8个字节的数据,包括帧头和数据包丢弃检测;
MAVLink V2每帧最少只有14个字节的数据(是一个更加安全和可扩展的协议);

2.非常可靠
自2009年以来,MAVLink一直被用于在各种不同且具有挑战性的通信信道上的许多不同车辆,地面站(和其他节点)之间进行通信。它提供了检测数据包丢失,损坏和数据包身份验证的方法。

3.支持多种编程语言
可在多种MCU(如:STM32、Atmega、ARM7)和操作系统(如:Windows,Linux,MacOS,Android和iOS)上运行。

4.支持网络上最多255个并发系统

参考网址
官网:https://mavlink.io/en

地面站:
http://qgroundcontrol.org/mavlink/start

维基百科:
https://en.wikipedia.org/wiki/MAVLink

提示:微信公众号不支持外链接,请复制链接到浏览器打开)
MAVLink协议格式目前MAVLink有两个版本:V1和V2版本,差异及详情请看下图:

l5vrotdutz264091871417.jpg

l5vrotdutz264091871417.jpg


MAVLink V2是V1的拓展版本,是一个更加安全和可扩展的协议。

由于市面上应用较广的还是V1版本,且支持的编程语言也是V1多余V2。因此,接下来(MAVLink学习之路)我都会结合MAVLink V1来讲述(学会V1,V2和容易就掌握了)。

MAVLink V1格式
MAVLink通信内容包含常见通信协议帧头、帧尾、长度、校验等。协议格式及详情见下图:

uxtxhseynme64091871517.jpg

uxtxhseynme64091871517.jpg

应用编程主要内容
1、发送和接收说明
利用MAVLink通信协议进行编程,主要实现的功能就是:

1.发送端
将需要发送的数据(如:SysState, BatVol),添加MAVLink通信协议,通过硬件(如:UART、CAN)发送出去。

2.接收端
硬件(如:UART、CAN)接收到的数据,通过MAVLink协议解析,得到一帧完整的MAVLink数据包,提取发送端发送的数据(如:SysState, BatVol),将得到的数据应用到我们程序中。

主要流程:数据 -> MAVLink封装 -> 发送 -> 接收 -> MAVLink解析 ->数据
2.发送和接收流程图

xofhpkzlcuv64091871617.jpg

xofhpkzlcuv64091871617.jpg

该流程图是结合我上一篇文章提供的源代码例程画出来,包含的只是主要内容,更多细节没有在流程图中呈现。

提示
我提供例程是针对初学者提供比较单一发送和接收例程(MDK-ARM和EWARM包含各自的发送和接收工程)。

而实际项目可能会
1.发送和接收在一个工程;
2.包含操作系统;
3.发送、接收数据FIFO(队列)处理;

所以,实际项目,请按需修改我提供的源码
MAVLink函数接口详细说明
这一章节讲述发送和接收主要用到的函数接口,请参考我提供的源代码例程理解。为方便初学者理解,我将其分为发送和接收两个部分来讲述。
1. 发送主要函数接口

mdnbj1n0xeg64091871717.jpg

mdnbj1n0xeg64091871717.jpg

上面是我提供例程的代码,主要讲4个接口。

1.MAVLink_SendTest
这个接口是根据自己情况进行封装函数,用于应用程序调用,这里不多说。

2.mavlink_msg_sys_info_pack
这个函数接口主要目的:将变量信息(SysID、CompID、SysState、BatVol)打包,最终得到MAVLink_Msg这个消息包。

3.mavlink_msg_to_send_buffer
将上一步得到的MAVLink_Msg转换成我们要发送的数据BUF缓存。

4.MAV_USART_SendNByte
这个函数接口也是我自己根据硬件(UART)封装的,如果你是其它硬件通信,只需要封装一个类似的接口(参数具有BUF,LEN)即可。

发送数据的流程:从应用代码 -> 底层硬件(发送出去)。

如果要深入了解,可以先熟悉软件流程,再结合源代码工程,同时参看接口函数具体实现。相信你很快就明白了。
2.接收主要函数接口

q3ofmkxjofp64091871817.jpg

q3ofmkxjofp64091871817.jpg

上面是我提供例程的代码(方便截图,去掉了部分),主要讲以上4点内容。
1.MAV_USART_GetByte该函数接口也是硬件底层通信接口,请根据自己情况修改,只需要传递数据(流)进来即可。
2.mavlink_parse_charMAVLink解析是按照一个一个字符进行解析,我们接收到一个字符,就对其进行解析,直到解析完(根据返回标志判断)一帧数据为止。
3.if(MAVLINK_MSG_ID_SYS_INFO == MAVLinkMsg.msgid)这里就是对解析好的一包完整消息进行分类判断吧。其实,我是想说,这个地方还有两个ID需要进行判断,SysID系统ID和CompID部件ID。
我提供例程为方便初学者快速理解,未提供SysID和CompID判断,在后续应用编程中会用到。
4.mavlink_msg_sys_info_get_voltage_battery通过该接口获取消息变量,看图中说明文字,前面是消息,后面是消息变量
接收数据的流程:从底层硬件(接收数据) -> 应用代码。
以上就是发送和接收的主要函数接口,如果你只是简单的进行通信,这几个接口就够你使用了。当然,更高级的编程应用还需要你进一步掌握其中的内容。
本节提供“MAVLink发送接收例程”例程下载地址:地址:
https://pan.baidu.com/s/1xraErAnmL-BN9CMwE6aQ-A
密码:cusq
(公众号不支持外链接,请复制链接到浏览器打开)
------------ END ------------

ircayjaslvc64091871917.gif

ircayjaslvc64091871917.gif

●专栏《嵌入式工具●专栏《嵌入式开发》●专栏《Keil教程》●嵌入式专栏精选教程
关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
点击“阅读原文”查看更多分享。
回复

使用道具 举报

发表回复

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

本版积分规则

关闭

站长推荐上一条 /1 下一条


联系客服 关注微信 下载APP 返回顶部 返回列表