赞
踩
根据需求,需要写一个给pixhawk刷固件的工具。根据开源地面站mission planner的源码来改。
对hex文件进行处理,读取校验等。会用到mission planner 项目里面的Firmware class、fastJSON namespace等。此部分依赖性不高,对应模块贴进去后会提示缺失部分,去missionplanner 源码里面找到相应的添加上即可。粘代码的时候尽量精准找到所需,如果添加上不必要的函数会导致依赖性急剧提升,报错提高,导致贴不完的代码。
这个函数用于检测pixhawk硬件是否是在等待刷机的状态。
先贴出此部分的源代码:
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); } } }
注意到里面右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();
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。