在做无人机主站时,面临利用mavlink协议进行串行通信;总体上来说,主站一方面需要实时的知道设备的当前运行数据,一方面又要可以发送命令到设备和进行一些参数查询交互,为了达到这种特殊的要求,参考mavlink协议,可以通过设备主动向主站不停的发送心跳包,心跳包中包括当前设备状态,如位置、转速、角度等参数。具体来说,主站编程思路是:
1、定义消息。
2、定义设备类。设备类中包含设备的状态数据
3、定义协议接口,包含设备实例,定义读包方法readPackage,定义读数据锁,写数据锁,定义giveComport独占标识(标识是否可以读取心跳包),定义设备控制方法(独占giveComport->产生命令数据包->读数据包->返回->释放独占giveComport)
4、开启一个心跳包监听线程,检测读是否空闲giveComport,空闲则进行数据读取解析,将解析的状态数据存入设备类中。
具体来说,对于开源地面站MissionPlanner,在MAVLINK动态库中定义消息,MissionPlanner.MAVLinkInterface中实现协议接口,MainV2主界面中开启线程进行心跳包监听,定时的在giveComport==false时,调用MAVLinkInterface.ReadPacket()进行读包,读到的包存入设备类MAVState的包存储器中packets中,供后续飞行数据界面数据刷新用。要发送命令到飞控,首先独占数据区giveComport设为true,阻止监听线程读包,打包发送命令数据,再进行读包解析,全部采用同步阻塞的方式,超时重发,返回时释放giveComport。
对于其他的一些设备,要在主站实现一些自动控制功能,也可以采用这个通信方式。