查看完整版本: uuprog开发教程:烧写工程管理2

liyf 发表于 2014-11-30 07:14:59

uuprog开发教程:烧写工程管理2

       上节我们已经讲解了ppf文件的结构,这节我们将继续讲解读写代码部分。使用文件结构来读写文件可以方便有效的读取和写入而又不会出错,通过结构体有效的匹配每个文件体中的各变量。

从上图可以看出借个工程文件操作函数:OnFileProjectOpen()打开工程文件、OnFileProjectSaveAs()保存工程文件、OnFileProjectAttribute()设置工程属性、OnFileProjectClose()关闭工程。打开和保存基本就是两个对立的操作过程,也是整个操作的难点。
1、打开工程
void CUUProgDlg::OnFileProjectOpen()
{
      // TODO: Add your command handler code here
      CFile ldfile;
      CString m_sFileExt;

      SetAppLog("加载工程开始...");
      //保存工程文件代码
      CFileDialog mDlg(TRUE,".PPF",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"编程器工程文件(*.ppf)|*.ppf||",this);
      if(mDlg.DoModal() == IDOK)
      {
                m_sProjectFilename = mDlg.GetPathName();
                m_sFileExt = mDlg.GetFileExt();
                m_sFileExt.MakeUpper();
                //加载文件
                if(!m_sProjectFilename.IsEmpty())
                {
                        SetAppLog("加载文件:"+m_sProjectFilename);
                        if(ldfile.Open(m_sProjectFilename,CFile::shareCompat|CFile::modeRead,NULL))
                        {
                              int nFileSize;
                              nFileSize=ldfile.GetLength();
                              if(m_sFileExt=="PPF")
                              {
                                        char* pFileBuf=(char*)GlobalAlloc(GMEM_FIXED,nFileSize+1);
                                        memset(pFileBuf,0,nFileSize+1);
                                        ldfile.Read(pFileBuf,nFileSize);
                                        memcpy(&m_stPFileHead,pFileBuf,sizeof(ProjectFileHeadStruct));
                                        memcpy(&m_stPFile,&pFileBuf,sizeof(ProjectFileStruct));
                                        CProjectPasswordDlg passworddlg;
                                       
                                        if(passworddlg.DoModal() == IDOK)
                                        {
                                                if(m_stPFile.AccessPassword != passworddlg.m_sProjectPassword)
                                                {
                                                      SetAppLog("访问密码错误");
                                                      AfxMessageBox("访问密码错误");
                                                      GlobalFree(pFileBuf);
                                                      ldfile.Close();
                                                      ZeroMemory(&m_stPFile, sizeof(ProjectFileStruct));
                                                      ZeroMemory(&m_stPFileHead, sizeof(ProjectFileHeadStruct));
                                                      return;
                                                }
                                        }
                                        else
                                        {
                                                GlobalFree(pFileBuf);
                                                ldfile.Close();
                                                SetAppLog("取消加载工程");
                                                ZeroMemory(&m_stPFile, sizeof(ProjectFileStruct));
                                                ZeroMemory(&m_stPFileHead, sizeof(ProjectFileHeadStruct));
                                                return;
                                        }
                                        memcpy(pProgBuff,&pFileBuf,nFileSize-sizeof(ProjectFileHeadStruct)-sizeof(ProjectFileStruct));
                                        GlobalFree(pFileBuf);
                                        ldfile.Close();
                                        SetAppLog("加载完成:"+Int2Str(nFileSize)+"字节");
                                        SetMenuItem(false);
                                        SetLoadFileName(m_sProjectFilename);
                                        CString temp;
                                        for (int i=0; i<m_arDeviceList.GetSize(); i++)
                                        {
                                                temp = m_arDeviceList.GetAt(i).DeviceName;
                                                if(m_stPFile.DeviceName == temp)
                                                {
                                                      SetDeviceInfo(i);
                                                      break;
                                                      
                                                }
                                        }
                              }
                              else
                              {
                                        SetAppLog("文件格式不支持");
                                        AfxMessageBox("文件格式不支持");
                              }
                        }
                        else
                        {
                              SetAppLog("加载文件失败");
                              AfxMessageBox("加载指定的文件出错");
                        }
                }
      }      
      
      else
      {
                SetAppLog("取消加载文件");
      }
      
}
2、保存工程
void CUUProgDlg::OnFileProjectSaveAs()
{
      // TODO: Add your command handler code here
      CString projectfilename;
      CFile savefile;
      CString m_sFileExt;
      int buffsize;

      SetAppLog("工程保存开始...");
      buffsize = GetMinLength(pProgBuff,m_dDeviceSize);
      if (buffsize ==0)
      {
                SetAppLog("缓冲区无数据,取消保存");
                AfxMessageBox("缓冲区无数据,不需保存");
                return;
      }
      CFileDialog mDlg(FALSE,".PPF",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"编程器工程文件(*.ppf)|*.ppf||",this);
      if(mDlg.DoModal() == IDOK)
      {
                projectfilename = mDlg.GetPathName();
                m_sFileExt = mDlg.GetFileExt();
                m_sFileExt.MakeUpper();
                SetAppLog("保存为:"+projectfilename);
                //保存文件代码
                if (m_sFileExt=="PPF")
                {
                        if(savefile.Open(projectfilename,CFile::shareCompat|CFile::modeCreate|CFile::modeWrite,NULL))
                        {
      m_stPFile.BuffCheckCRC = m_dBuffCheckCRC;
      m_stPFileHead.ProjectFileCRC = m_dProjectFileCRC;
      m_stPFile.BuffSize = buffsize;
      strcpy(m_stPFile.UUProgSN,m_sUUProgSN);
      strcpy(m_stPFileHead.Appname,"UUProg V"+m_sAppVer);
      strcpy(m_stPFileHead.ProjectFileVer,m_sAppVer);
      strcpy(m_stPFile.DeviceName,m_sDeviceName);
                              //m_editBuf2.GetData(m_Pro.m_pReadBuf,0x10000);
                              savefile.Write(&m_stPFileHead,sizeof(ProjectFileHeadStruct));
                              savefile.Write(&m_stPFile,sizeof(ProjectFileStruct));
                              savefile.Write(pProgBuff,buffsize);
                              savefile.Close();
                              SetAppLog("保存完成:"+Int2Str(sizeof(ProjectFileHeadStruct)+sizeof(ProjectFileStruct)+buffsize)+"字节");
                        }
                }
                else
                {
                SetAppLog("文件格式不支持");
                AfxMessageBox("文件格式不支持");
                }
      }      
      else
      {
                SetAppLog("取消保存");
      }

}3、工程属性操作
void CProgProjectAttribute::OnOk()
{
      // TODO: Add your control notification handler code here
      UpdateData(true);
      if (parent->m_sProjectFilename.IsEmpty())
      {
      strcpy(parent->m_stPFile.CreateDate,m_sProjectCreateDate);
      }
      if(m_sAccessPassword != m_sAccessPassword1)
      {
                AfxMessageBox("两次输入的访问密码不一致");
                return;
      }
      strcpy(parent->m_stPFile.AccessPassword,m_sAccessPassword);
      if(m_sSecurityPassword != m_sSecurityPassword1)
      {
                AfxMessageBox("两次输入的安全密码不一致");
                return;
      }
      strcpy(parent->m_stPFile.SecurityPassword,m_sSecurityPassword);
      strcpy(parent->m_stPFile.EditDate,m_sProjectModifyDate);
      strcpy(parent->m_stPFile.ProjectName,m_sProjectName);
      strcpy(parent->m_stPFile.ProjectNote,m_sProjectNote);
      
      CDialog::OnOK();
}4、关闭工程
void CUUProgDlg::OnFileProjectClose()
{
      // TODO: Add your command handler code here
      if(!m_sProjectFilename.IsEmpty())
      {
      ZeroMemory(&m_stPFile, sizeof(ProjectFileStruct));
      ZeroMemory(&m_stPFileHead, sizeof(ProjectFileHeadStruct));
      memset(pProgBuff,0xff,m_dDeviceSize);
      SetMenuItem(true);
      m_sProjectFilename = "";
      SetLoadFileName("未加载文件");
      }
      else
      {
                SetAppLog("未打开工程文件,不需关闭");
                AfxMessageBox("未打开工程文件,不需关闭");
      }
}具体的请参考源代码。






bywqdq 发表于 2015-1-12 09:26:33

支持一下,liyf真的很用心啊。

program 发表于 2017-8-12 13:19:36

uuprog 源代码哪里还可以下载?

liyf 发表于 2017-8-12 15:53:13

program 发表于 2017-8-12 13:19
uuprog 源代码哪里还可以下载?

置顶贴啊
完全开源UUprog v1.2b编程器制作资料--第二阶段:2015.5.7 UUProg v1.3原理图+pcb
http://www.diybcq.com/thread-93167-1-1.html
(出处: DIY编程器网)

programmer 发表于 2017-9-7 21:01:25

支持一下,liyf真的很用心啊。

david69 发表于 2017-9-14 15:45:12

好东西,感谢分享!!

jy11 发表于 2017-9-18 12:35:24

好东西,感谢分享!!

jcwangzi 发表于 2017-9-25 22:47:06

好东西,感谢分享!!

zhuihai 发表于 2018-12-27 22:01:13

谢谢分享银子 不够
页: [1]
查看完整版本: uuprog开发教程:烧写工程管理2