当前位置:   article > 正文

MissionPlanner的固件下载模块_missionplanner1.3.28

missionplanner1.3.28

背景

根据需求,需要写一个给pixhawk刷固件的工具。根据开源地面站mission planner的源码来改。

MissionPlanner刷固件程序流程


Created with Raphaël 2.2.0 开始 ProcessFirmware()读取hex固件文件 AttemptRebootToBootloader()重启硬件进入刷机状态 identify()验证硬件已进入刷机状态 currentChecksum()固件校验 upload()下载固件 结束

子模块简介

ProcessFirmware()

对hex文件进行处理,读取校验等。会用到mission planner 项目里面的Firmware class、fastJSON namespace等。此部分依赖性不高,对应模块贴进去后会提示缺失部分,去missionplanner 源码里面找到相应的添加上即可。粘代码的时候尽量精准找到所需,如果添加上不必要的函数会导致依赖性急剧提升,报错提高,导致贴不完的代码。

identify()

这个函数用于检测pixhawk硬件是否是在等待刷机的状态。

AttemptRebootToBootloader()

先贴出此部分的源代码:

        private void AttemptRebootToBootloader()
        {
            string[] allports = SerialPort.GetPortNames();

            foreach (string port in allports)
            {
                log.Info(DateTime.Now.Millisecond + " Trying Port " + port);
                try
                {
                    using (var up = new Uploader(port, 115200))
                    {
                        up.identify();
                        return;
                    }
                }
                catch (Exception ex)
                {
                    log.Error(ex);
                }
            }

            if (MainV2.comPort.BaseStream is SerialPort)
            {
                try
                {
                    updateProgress(-1, "Look for HeartBeat");
                    // check if we are seeing heartbeats
                    MainV2.comPort.BaseStream.Open();
                    MainV2.comPort.giveComport = true;

                    if (MainV2.comPort.getHeartBeat().Length > 0)
                    {
                        updateProgress(-1, "Reboot to Bootloader");
                        MainV2.comPort.doReboot(true, false);
                        MainV2.comPort.Close();
                    }
                    else
                    {
                        updateProgress(-1, "No HeartBeat found");
                        MainV2.comPort.BaseStream.Close();
                        CustomMessageBox.Show(Strings.PleaseUnplugTheBoardAnd);
                    }
                }
                catch (Exception ex)
                {
                    log.Error(ex);
                    CustomMessageBox.Show(Strings.PleaseUnplugTheBoardAnd);
                }
            }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

注意到里面右identify()函数调用,此函数用于检测pixhawk硬件是否是在等待刷机的状态。如果已经属于等待刷机的状态,则跳出AttemptRebootToBootloader()函数。如果不是,则通过命令发送重启并进入等待刷机状态的命令。针对comPort的操作大多是用于检测HeartBeat心跳包来确定硬件是否插在电脑上以及插到了哪个com口。还有代码块一些是用来更新进度条用的。
此段函数可简化为:

        private void AttemptRebootToBootloader()
        {
             try
             {
                 up.identify();
                 return;
             }
             catch (Exception ex)
             {
                 log.Error(ex);
             }
             MainV2.comPort.doReboot(true, false);
             MainV2.comPort.Close();
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
doReboot()
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/488794
推荐阅读
相关标签
  

闽ICP备14008679号