### 2017-5-12 px4的mavlink,这是很久以前的笔记,留于此作为记录。
mavlink找到两个函数就可以了解整体框架:
1 MavlinkReceiver类的receive_thread函数,这个函数用于接收mavlink消息包。这个线程采用while+poll结构获得字节流,然后解析,满足mavlink包条件,对收到的包进行处理,调用2个handle_message。
2 Mavlink类的task_main中的stream->update函数,这个用于发送mavlink消息包。这个update对配置的每个steam执行send处理。具体的方式是通过一个StreamListItem指针数组,取出每个stream,然后调用Mavlink_stream的send函数,实际上是调用每个Mavlink_stream的子类的send函数,在send函数里,调用由xml文件自动生成的mavlink封装发送函数。这里体现了c++的继承和封装(不知道这话说的对不对)而自己的mavlink消息只要在xml文件添加或者修改即可。编译px4固件时,各个消息包的自动封装函数和解析函数就都有了。
1 px4的mavlink首先是在mavlink_main.cpp文件中。每个mavlink例程都是通过start_helper函数new新建启动的。然后运行每个例程中的task_main启动主循环。
在这个函数进入循环以前,新建一个接受处理线程receive_thread,receive做什么,接收函数最后落实到干活函数就是recrive_thread函数。这个函数是典型的while+poll通信工作模式。这个函数主要是通过udp或uart接收byte,然后解析,满足mavlink协议的数据包进行处理,建议这部分具体的mavlink_parse_char函数,通信解析处理的典型方式,基本就是switch-case模式。然后2个接收处理函数:
handle_message;这个是主要处理一般的mavlink命令,有需要立刻回复的就直接回复,有需要设立标志的就设立标志。然后在mavlink中根据标志进行发送处理。
_mavlink->handle_message;//这个是mavlink层处理的mavlink信息,包括任务相关的messange(_mission_manager),参数相关的message(_parameters_manager),ftp相关的message(_mavlink_ftp),(这部分我没有看),日志message相关的(_mavlink_log_handler),最后是mavlink消息转发相关的。(这部分也没看)有了发送函数,看mavlink类task_main函数,在这个函数最下端,有这样的语句:
LL_FOREACH(_streams, stream){stream->update(t);}.这里会逐一调用每个stream的send函数把mavlink信息包发出去。这样mavlink就有来有去,活动起来了。
具体处理过程都干些什么,自己慢慢梳理,挺有意思的。
阅读(1864) | 评论(0) | 转发(0) |