Mavlink地面站编写之五-Mission Planner中ProgressReporterDialogue和读串口线程serialreaderthread的分析

转载请注明出处:http://www.amovauto.com/?p=660  阿木社区,玩也要玩的专业。QQ群: 526221258

ProgressReporterDialogue


这个对话框很有意思,在MP中连接阶段打开端口和读取参数表和读入参数航点,都用的这个对话框这个对话框开启了后台委托线程,想用到社区地面站中,这种模块还是比较值得借鉴和使用的。

我们来分析下这个模块。我们在主界面点击了连接按钮之后程序会运行到,.....在mavlinkinterface的open函数中可以看到这段代码

public void Open(bool getparams, bool skipconnectedcheck = false)
        {
            if (BaseStream.IsOpen && !skipconnectedcheck)
                return;

            MAVlist.Clear();

            frmProgressReporter = new ProgressReporterDialogue
            {
                StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen,
                Text = Strings.ConnectingMavlink
            };

            if (getparams)
            {
                frmProgressReporter.DoWork += FrmProgressReporterDoWorkAndParams;
            }
            else
            {
                frmProgressReporter.DoWork += FrmProgressReporterDoWorkNOParams;
            }
            frmProgressReporter.UpdateProgressAndStatus(-1, Strings.MavlinkConnecting);
            ThemeManager.ApplyThemeTo(frmProgressReporter);

            frmProgressReporter.RunBackgroundOperationAsync();

            frmProgressReporter.Dispose();

            if (ParamListChanged != null)
            {
                ParamListChanged(this, null);
            }
        }

MAVlist.Clear();这个MAVlist应该是支持多个APM的状态列表,据说MP支持组队飞行,这个咱暂不表。
FrmProgressReporterDoWorkNOParams这个委托很重要,我们看看OpenBg(object PRsender, bool getparams, ProgressWorkerEventArgs progressWorkerEventArgs)这个函数,最终就是执行这个函数,这个函数里面有一些刷新参数列表的操作,读代码的时候经常出现MAV这个变量,注意其实mavlink读取到的参数都放在MAVState MAV这个里面的(MAVLinkInterface.cs里面)
系统ID,名称,还有实时更新的飞行数据也都在里面。看下它的定义我们就知道
public MAVState MAV
{
get { return MAVlist[sysidcurrent, compidcurrent]; }
set { MAVlist[sysidcurrent, compidcurrent] = value; }
}
是维护了一个mavlink数据列表,所以mavlink协议支持多机通信。MAV是整个协议里面非常重要的变量。其实这个上面对话框读取到的数据都放在MAV里面。这个对话框就是打开端口和读取参数表给地面站连接数据初始化用的。
数据读取线程serialreaderthread
一开始我以为是采用委托来读取数据,后来分析程序发现是在MainV2.cs中的 protected override void OnLoad(EventArgs e)载入了数据读取线程
// setup main serial reader
serialreaderthread = new Thread(SerialReader)
{
IsBackground = true,
Name = "Main Serial reader",
Priority = ThreadPriority.AboveNormal
};
serialreaderthread.Start();
设定了优先级来保证他的执行,这个线程在打开连接之后就一直执行,不断的更新数据,里面有非常多的代码完成了,语音告警,HUD的告警,地面站状态等等的处理。其他我们先不看,但是线程里面有非常重要的一句话:

 while (port.BaseStream.IsOpen && port.BaseStream.BytesToRead > minbytes &&
                               port.giveComport == false)
                        {
                            try
                            {
                                port.readPacket();
                            }
                            catch (Exception ex)
                            {
                                log.Error(ex);
                            }
                        }
                        // update currentstate of sysids on the port
                        foreach (var MAV in port.MAVlist.GetMAVStates())
                        {
                            try
                            {
                                MAV.cs.UpdateCurrentSettings(null, false, port, MAV);
                            }
                            catch (Exception ex)
                            {
                                log.Error(ex);
                            }
                        }

port.readPacket();这个函数是读取飞控数据。 MAV.cs.UpdateCurrentSettings(null, false, port, MAV);更新数据到MAV中。都是mavlinkinterface的接口,mavlinkinterface是MP中最重要的代码之一。
经过以上的程序,MVA里面的数据就可以作为显示使用了, port.readPacket();里面的代码非常复杂,涉及到很多超时连接的问题,做了很多数据验证工作,同时输出log日志。建议移植来用即可,MP对于数据的稳定性还是处理的很专业,可以参考。 MAV.cs.UpdateCurrentSettings(null, false, port, MAV);这个是更新数据到MAV。有了这两句话,就可以把所有的数据读出来了,我们放在UI显示即可。但是MP这种在主线程里面更新UI的做法,不晓得原著是基于什么样的考虑。求C#高手指点,过几天整理出这个的修改版源码,上传到社区。敬请关注阿木社区,玩也要玩的专业的社区

http://www.amovauto.com/?p=660#more-660

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值