| 
 | 
 
       经过前几次的讲解我们已经多bootloader有了个认识,现在我们需要把更新代码加到我们的上位机上就完美了。同时还要给我们的更新界面做得好看些,配合些提示功能,完善更新固件功能。 
 
 
从界面可以看出和前一节的实现功能差别很大,除了升级(前面的烧写)功能,其他去哪了呢?难道不需要了吗? 
当然不是的,那些功能是不能少的,联机-》擦除-》烧写-》校验,这些功能都集成到升级功能里了,也就是他一次实现了前面的几个功能而已。 
 
 
直接资源图中的升级按钮就会定位到实现功能函数了,如上图。 
下面是实现代码 
- void CUpdateFW::OnOk() 
 
 - {
 
 -         // TODO: Add your control notification handler code here
 
 - //        BOOL m_bUpdate=0;
 
 -         int pos=0;
 
 -         CString sVersion;
 
 -         m_cProgress.SetRange(0,100);
 
 -         m_cProgress.SetPos(0);
 
 -         
 
 -         if(m_bUpdate)
 
 -         {
 
 -         parent->SetAppLog("固件已更新完成!请不要再重试");
 
 - //        OnDestroy();
 
 -         AfxMessageBox(_T("固件已更新完成,请不要再重试,可以关闭了"));
 
 -                         return;
 
 -         }
 
 -         
 
 -         //加载文件
 
 -         if(!m_sFilename.IsEmpty())
 
 -         {
 
 -                 if(pFlash != NULL)
 
 -                         delete pFlash;
 
 -                 pFlash = new CFlashmem(512);
 
 -                 pFlash->ReadFromIHEX(m_sFilename.GetBuffer(m_sFilename.GetLength()));
 
 -                 
 
 -                 if(pFlash->GetPageToAddress(0x0000) != NULL || pFlash->GetPageToAddress(0x2600) != NULL)
 
 -                 {
 
 -         parent->SetAppLog("文件地址错误,文件地址需要从0x2800开始!");
 
 -                         pFlash->ClearAll();
 
 -                         return;
 
 -                 }
 
 -                 else
 
 -                 {
 
 -         parent->SetAppLog("打开文件成功:"+m_sFilename);
 
 -                         pos = 5;
 
 -                         m_cProgress.SetPos(pos);
 
 -                 }
 
 -         }
 
 -         else
 
 -         {
 
 -         parent->SetAppLog("请先指定待更新的固件!");
 
 -                         return;
 
 -         }
 
  
-         //打开设备
 
 -         if(mUsbhid.Open(0))
 
 -         {
 
 -         parent->SetAppLog("打开设备成功!");
 
 -                 mUsbhid.GetVersion(&sVersion);
 
 -         parent->SetAppLog("固件版本:"+sVersion);
 
 -                         pos += 5;
 
 -                         m_cProgress.SetPos(pos);
 
 -         }
 
 -         else
 
 -         {
 
 -         parent->SetAppLog("打开设备失败!请检查编程器是否已进入更新模式!");
 
 -                         return;
 
  
-         }
 
  
-         //擦除
 
 -         parent->SetAppLog("开始擦除设备...");
 
 -         CString str;
 
 -         if(pFlash == NULL)
 
 -                 return;
 
 -         CPage* pPage;
 
 -         pPage = pFlash->GetFirstpage();
 
 -         while (pPage != NULL) {
 
 -                 if(mUsbhid.EraseSector(pPage->GetPageaddress()))
 
 -                 {
 
 -                         str.Format("%.4X ",pPage->GetPageaddress());
 
 -         parent->SetAppLog(str +  "擦除成功!");
 
 -                         pos += 1;
 
 -                         m_cProgress.SetPos(pos);
 
 -                 }
 
 -                 else
 
 -                 {
 
 -                         str.Format("%.4X ",pPage->GetPageaddress());
 
 -         parent->SetAppLog(str +  "擦除失败!");
 
 -                         return;
 
 -                 }
 
 -                 pPage = pPage->GetNext();
 
 -         } 
 
 - //                        m_cProgress.SetPos(30);
 
 -         
 
 -         //下载
 
 -         parent->SetAppLog("开始下载固件...");
 
 -         pPage = pFlash->GetFirstpage();
 
 -         while (pPage != NULL) {
 
 -                 if(mUsbhid.Write(pPage->GetPageaddress(),pPage->GetData(),pPage->GetPagesize()))
 
 -                 {
 
 -                         str.Format("%.4X ",pPage->GetPageaddress());
 
 -         parent->SetAppLog(str + "下载成功!");
 
 -                         pos += 1;
 
 -                         m_cProgress.SetPos(pos);
 
 -                 }
 
 -                 else
 
 -                 {
 
 -                         str.Format("%.4X ",pPage->GetPageaddress());
 
 -         parent->SetAppLog(str + "下载失败!");
 
 -                         return;
 
 -                 }
 
 -                 pPage = pPage->GetNext();
 
 -         } 
 
 -         
 
 -         //校验
 
 -         parent->SetAppLog("开始校验固件...");
 
 -         pPage = pFlash->GetFirstpage();
 
 -         while (pPage != NULL) {
 
 -                 if(mUsbhid.Verify(pPage->GetPageaddress(),pPage->GetData(),pPage->GetPagesize()))
 
 -                 {
 
 -                         str.Format("%.4X ",pPage->GetPageaddress());
 
 -         parent->SetAppLog(str +  "校验成功!");
 
 -                         m_bUpdate=true;
 
 -                         pos += 1;
 
 -                         m_cProgress.SetPos(pos);
 
 -                 }
 
 -                 else
 
 -                 {
 
 -                         str.Format("%.4X ",pPage->GetPageaddress());
 
 -         parent->SetAppLog(str +  "校验失败!");
 
 -                         m_bUpdate=false;
 
 -                         return;
 
 -                 }
 
 -                 pPage = pPage->GetNext();
 
 -         }         
 
 -         
 
 -         //运行
 
 -         if(m_bUpdate)
 
 -         {
 
 -         parent->SetAppLog("固件更新成功!重启编程器...");
 
 -         mUsbhid.Run();
 
 -         parent->SetAppLog("重启成功!");
 
 -                         m_cProgress.SetPos(100);
 
 -         AfxMessageBox(_T("更新完成"));
 
 -         }
 
 -         else
 
 -         {
 
 -         parent->SetAppLog("固件更新失败!");
 
 -         }
 
 - }
 
 
  复制代码       看着挺复杂的,其实就是把联机-》擦除-》烧写-》校验这几个功能分步实现了,程序中都有相应提示,某人一直在说我们的代码看不懂,没有说明,不知道他要的说明是什么样的,这样的说明还看不懂的话那我也没法了,要是要每句都要写个提示的话我也无能为力了,你帮下忙吧。 
        当然用到的函数和相关文件都得移植过来,不然编译肯定过不了,怎么移植呢,这里就不是要具体讲解的内容了,这些技能是作为一个程序员必须掌握的基本工了。一直不成功的话就自己看看源代码,比较下和你的有什么区别吧。(这里有可能用到比较工具软件之类,我就直接用windiff) 
      界面还有些提示功能,以便显示你当前硬件和固件的信息,以及要更新后的信息,这部分功能是比较人性化的,但是我们这里只是做了初始化,还没有完全实现,所以源代码中找不到太多代码,这部分功能会在固件开发中一起实现的。 
 |   
 
 
 
 |