DIY编程器网

标题: uuprog开发教程:芯片支持库加载2-加载函数 [打印本页]

作者: liyf    时间: 2014-12-12 06:28
标题: uuprog开发教程:芯片支持库加载2-加载函数
前一节我们已经说道支持库的结构体,这是构建该文件的基本,通过结构体我们可以很方便的加载文件信息到内存,而且不用处理就可以用。
这部分的处理相当复杂,读取的顺序,结构大小,芯片的数量等等必须非常清楚,不然读出的数据100%错的,而且这里基本肯定要用调试功能,每修改一次必须过一次调试跟踪,切记。

这个函数可以说在整个软件设计中花时最多的,十几天的功夫基本都是耗在这上面,光修改和调试都超多10天,可想而知。对于那些说三道四,软件设计怎么怎么不值钱之类的人整改让他折腾下这个,设计软件的艰辛在哪。
这个函数的主要功能就是解析支持库,然后分类加载到内存中的变量中,因此必须要定义一些全局变量
  1. public:
  2.         void GetUpdate();
  3.         CString GetMacAddress();
  4.         CString GetCpuID();
  5.         CString GetGuid();
  6.         CString GetOSName();
  7.         int VerCompare(CString ver1,CString ver2);
  8.         DWORD m_dDeviceSize;
  9.         CArray<TypeStruct,TypeStruct> m_arTypeList;
  10.         CArray<TypeStruct,TypeStruct> m_arOperationList;
  11.         CArray<TypeStruct,TypeStruct> m_arSizeList;
  12.         CArray<TypeStruct,TypeStruct> m_arPinList;
  13.         CArray<TypeStruct,TypeStruct> m_arDataWidthList;
  14.         CArray<TypeStruct,TypeStruct> m_arPackageList;
  15.         CArray<TypeStruct1,TypeStruct1> m_arVCCList;
  16.         CArray<TypeStruct1,TypeStruct1> m_arVPPList;
  17.         CArray<TypeStruct,TypeStruct> m_arAdapterList;

  18.         CArray<DeviceListFileStruct,DeviceListFileStruct>  m_arDeviceList;
  19.         DeviceListFileStruct m_stDFile;
  20.         DeviceListFileHeadStruct m_stDFileHead;
  21.         ProjectFileHeadStruct m_stPFileHead;
  22.         ProjectFileStruct m_stPFile;
  23.         BYTE* pProgBuff;
  24.         CString m_sAppPath;
  25.         CString m_sAppVer;

  26. /*        CString m_sDeviceNote;
  27.         int m_iDevicePinCount;
  28.         int m_iDeviceDataWidth;
  29.         DWORD m_dDeviceID;
  30.         float m_fDeviceVPP;
  31.         DWORD m_dDeviceCheckCRC;
  32.         CString m_sDevicePackage;
  33.         float m_fDeviceVCC;
  34.         int m_iDeviceSize;
  35.         DWORD m_dDeviceManuID;
  36.         CString m_sDeviceAdapter;
  37.         CString m_sDeviceName;
  38. */
  39.         DWORD        m_dBuffCheckCRC;
  40.         DWORD        m_dProjectFileCRC;
  41.         CString m_sFilename;
复制代码
而且必须在程序启动时就要初始化
  1. CUUProgDlg::CUUProgDlg(CWnd* pParent /*=NULL*/)
  2.         : CDialog(CUUProgDlg::IDD, pParent)
  3. {
  4.         //{{AFX_DATA_INIT(CUUProgDlg)
  5.         m_AppLog = _T("");
  6.         m_sDeviceAdapter = _T("");
  7.         m_sDeviceCheckCRC = _T("");
  8.         m_sDeviceID = _T("");
  9.         m_sDeviceManuID = _T("");
  10.         m_sDeviceName = _T("");
  11.         m_sDeviceNote = _T("");
  12.         m_sDevicePackage = _T("");
  13.         m_sDeviceSize = _T("");
  14.         m_sDeviceType = _T("");
  15.         m_sDeviceVCC = _T("");
  16.         m_sDeviceVPP = _T("");
  17.         m_sDeviceDatasheet = _T("");
  18.         m_sLoadFileName = _T("");
  19.         //}}AFX_DATA_INIT
  20.         // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  21.         m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  22.         m_bProgLink = false;
  23.         m_bOneKeyMode = true;
  24.         m_iAppLogLine = 0;
  25.         m_dBuffCheckCRC = 0;
  26.         m_dProjectFileCRC = 0;
  27.         m_dDeviceSize = 0;
  28.         m_sAppPath = "";
  29.         m_sUUProgSN = "------";
  30.         m_sUUProgHWVer = "----";
  31.         m_sUUProgFWVer = "----";
  32.         m_sUUProgFWDate = "--------";
  33.         m_sUUProgType = "------";
  34.         ZeroMemory(&m_stPFile, sizeof(ProjectFileStruct));
  35.         ZeroMemory(&m_stPFileHead, sizeof(ProjectFileHeadStruct));
  36.         ZeroMemory(&m_stDFile, sizeof(DeviceListFileStruct));
  37.         ZeroMemory(&m_stDFileHead, sizeof(DeviceListFileHeadStruct));
  38. //        pProgBuff=(BYTE*)GlobalAlloc(GMEM_FIXED,0x10000);//½¨Á¢»º³å1
  39. //        memset(pProgBuff,0xff,0x10000);
  40. }
复制代码
然后就是指定函数什么时候加载了,这里我们用到了定时器,其实这个的处理比较蛋疼的,想要实现加载信息实时显示,用多线程该是最好的方案,但是我们这里只用到了定时器延时启动,避免程序启动时就一闪而过,看不到加载的效果。
  1. void CUUProgDlg::OnTimer(UINT nIDEvent)
  2. {
  3.     // TODO: Add your message handler code here and/or call default
  4.     SetAppLog("欢迎使用UUProg编程器应用程序");
  5.     SetAppLog("设计开发:Liyf");
  6.     SetAppLog("支持网站:http://www.diybcq.com");
  7. //    SetAppLog("          http://kitebee.gnway.net");
  8.     SetAppLog("QQ群:41210778");
  9.     SetAppLog("<----------------------------------------------");
  10.     SetAppLog("");
  11.     //初始化程序
  12.     SetAppLog("程序初始化...");
  13.     GetAppVer();
  14.     GetAppPath();
  15.     SetAppLog("加载配置...");
  16.     LoadConfig();
  17.     SetAppLog("设置计数器...");
  18.     SetCount();
  19.     SetAppLog("加载芯片列表...");
  20.     LoadDeviceList();
  21.     SetAppLog("加载最近编程芯片...");
  22.     if(!m_sDeviceName.IsEmpty())//加载最近编程芯片
  23.     {
  24.                         CString temp;
  25.                     for (int i=0; i<m_arDeviceList.GetSize(); i++)
  26.                     {
  27.                         temp = m_arDeviceList.GetAt(i).DeviceName;
  28.                         if(m_sDeviceName == temp)
  29.                         {
  30.                             SetDeviceInfo(i);
  31.                             break;
  32.                            
  33.                         }
  34.                     }
  35.     }
  36.        SetAppLog("初始化完成!");
  37.     SetAppLog("<----------------------------------------------");
  38.     SetAppLog("");
  39.        SetAppLog("操作系统:"+GetOSName());
  40.        SetAppLog("CID:"+GetCpuID()+"-"+GetMacAddress());
  41.        SetAppLog("UID:"+GetGuid());
  42.     SetAppLog("<----------------------------------------------");
  43.     SetAppLog("");
  44.     m_bProgLink = FindUUProg();
  45.     SetAppLog("<----------------------------------------------");
  46.     SetAppLog("");
  47.     SetAppLog("检测是否有软件更新...");
  48.     GetUpdate();
  49.     SetAppLog("<----------------------------------------------");

  50.     KillTimer(1);   
  51.    
  52.     CDialog::OnTimer(nIDEvent);
  53. }

复制代码
下面就是LoadDeviceList()函数了,非常复杂的,慢慢看
  1. void CUUProgDlg::LoadDeviceList()
  2. {
  3.         CFile ldfile;
  4.         if(ldfile.Open(m_sAppPath+"device.pdl",CFile::shareCompat|CFile::modeRead,NULL))
  5.         {
  6.                 int        BufSize=ldfile.GetLength();
  7.                 int StartAddr;
  8.                 BYTE* fileBuf=new BYTE[BufSize];
  9.                 ldfile.Read(fileBuf,BufSize);
  10.                 memcpy(&m_stDFileHead,fileBuf,sizeof(DeviceListFileHeadStruct));
  11.                 int result = VerCompare(m_sAppVer,m_stDFileHead.DeviceListFileVer);
  12.                 if(result != 0)
  13.                 {
  14.                 AfxMessageBox("芯片支持库版本不匹配,请从新安装软件!");
  15.                 GlobalFree(fileBuf);
  16.                 ldfile.Close();
  17.                 }
  18.                 //Type List
  19.                 StartAddr = sizeof(DeviceListFileHeadStruct);
  20.                 TypeStruct* pType=(TypeStruct*)&fileBuf[StartAddr];
  21.                 for(int n=0;n<=m_stDFileHead.TypeListCount-1;n++)
  22.                 {
  23.                         m_arTypeList.Add(pType[n]);
  24.                 }
  25.                 //Operation List
  26.                 StartAddr += m_stDFileHead.TypeListCount*sizeof(TypeStruct);
  27.                 pType=(TypeStruct*)&fileBuf[StartAddr];
  28.                 for(n=0;n<=m_stDFileHead.OperationListCount-1;n++)
  29.                 {
  30.                         m_arOperationList.Add(pType[n]);
  31.                 }
  32.                 //Size List
  33.                 StartAddr += m_stDFileHead.OperationListCount*sizeof(TypeStruct);
  34.                 pType=(TypeStruct*)&fileBuf[StartAddr];
  35.                 for(n=0;n<=m_stDFileHead.SizeListCount-1;n++)
  36.                 {
  37.                         m_arSizeList.Add(pType[n]);
  38.                 }
  39.                 //Pin List
  40.                 StartAddr += m_stDFileHead.SizeListCount*sizeof(TypeStruct);
  41.                 pType=(TypeStruct*)&fileBuf[StartAddr];
  42.                 for(n=0;n<=m_stDFileHead.PinListCount-1;n++)
  43.                 {
  44.                         m_arPinList.Add(pType[n]);
  45.                 }
  46.                 //DataWidth List
  47.                 StartAddr += m_stDFileHead.PinListCount*sizeof(TypeStruct);
  48.                 pType=(TypeStruct*)&fileBuf[StartAddr];
  49.                 for(n=0;n<=m_stDFileHead.DataWidthListCount-1;n++)
  50.                 {
  51.                         m_arDataWidthList.Add(pType[n]);
  52.                 }
  53.                 //Package List
  54.                 StartAddr += m_stDFileHead.DataWidthListCount*sizeof(TypeStruct);
  55.                 pType=(TypeStruct*)&fileBuf[StartAddr];
  56.                 for(n=0;n<=m_stDFileHead.PackageListCount-1;n++)
  57.                 {
  58.                         m_arPackageList.Add(pType[n]);
  59.                 }
  60.                 //VCC List
  61.                 StartAddr += m_stDFileHead.PackageListCount*sizeof(TypeStruct);
  62.                 TypeStruct1* pType1=(TypeStruct1*)&fileBuf[StartAddr];
  63.                 for(n=0;n<=m_stDFileHead.VCCListCount-1;n++)
  64.                 {
  65.                         m_arVCCList.Add(pType1[n]);
  66.                 }
  67.                 //VPP List
  68.                 StartAddr += m_stDFileHead.VCCListCount*sizeof(TypeStruct1);
  69.                 pType1=(TypeStruct1*)&fileBuf[StartAddr];
  70.                 for(n=0;n<=m_stDFileHead.VPPListCount-1;n++)
  71.                 {
  72.                         m_arVPPList.Add(pType1[n]);
  73.                 }
  74.                 //Adapter List
  75.                 StartAddr += m_stDFileHead.VPPListCount*sizeof(TypeStruct1);
  76.                 pType=(TypeStruct*)&fileBuf[StartAddr];
  77.                 for(n=0;n<=m_stDFileHead.AdapterListCount-1;n++)
  78.                 {
  79.                         m_arAdapterList.Add(pType[n]);
  80.                 }

  81.                 //Device List
  82. //                memcpy(&m_stDFileHead,fileBuf,sizeof(DeviceListFileHeadStruct));
  83.                 StartAddr += m_stDFileHead.AdapterListCount*sizeof(TypeStruct);
  84.                 DeviceListFileStruct* pDevice=(DeviceListFileStruct*)&fileBuf[StartAddr];
  85.                 for(n=0;n<=m_stDFileHead.DeviceCount-1;n++)
  86.                 {
  87.                         m_arDeviceList.Add(pDevice[n]);
  88.                 }
  89.                 GlobalFree(fileBuf);
  90.                 ldfile.Close();
  91.         }
  92.         else
  93.         {
  94.         TypeStruct stType;
  95.         TypeStruct1 stType1;

  96.         ZeroMemory(&stType, sizeof(TypeStruct));
  97.         ZeroMemory(&stType1, sizeof(TypeStruct1));
  98.         strcpy(stType.TypeName,"EPROM");
  99.         stType.TypeVal = 1;
  100.         m_arTypeList.Add(stType);
  101.         strcpy(stType.TypeName,"MPU");
  102.         stType.TypeVal = 2;
  103.         m_arTypeList.Add(stType);
  104.         strcpy(stType.TypeName,"PLD");
  105.         stType.TypeVal = 3;
  106.         m_arTypeList.Add(stType);
  107.         strcpy(stType.TypeName,"PROM");
  108.         stType.TypeVal = 4;
  109.         m_arTypeList.Add(stType);

  110.         strcpy(stType.TypeName,"AT24(AT24xxx)");
  111.         stType.TypeVal = 1;
  112.         m_arOperationList.Add(stType);
  113.         strcpy(stType.TypeName,"AT51(AT89x5x)");
  114.         stType.TypeVal = 2;
  115.         m_arOperationList.Add(stType);
  116.         strcpy(stType.TypeName,"AT93(AT93xxx)");
  117.         stType.TypeVal = 3;
  118.         m_arOperationList.Add(stType);
  119.         strcpy(stType.TypeName,"EN25(EN25xxx)");
  120.         stType.TypeVal = 4;
  121.         m_arOperationList.Add(stType);

  122.         strcpy(stType.TypeName,"1k");
  123.         stType.TypeVal = 1024;
  124.         m_arSizeList.Add(stType);
  125.         strcpy(stType.TypeName,"2k");
  126.         stType.TypeVal = 2048;
  127.         m_arSizeList.Add(stType);
  128.         strcpy(stType.TypeName,"4k");
  129.         stType.TypeVal = 4096;
  130.         m_arSizeList.Add(stType);
  131.         strcpy(stType.TypeName,"8k");
  132.         stType.TypeVal = 8192;
  133.         m_arSizeList.Add(stType);

  134.         strcpy(stType.TypeName,"8 Pin");
  135.         stType.TypeVal = 8;
  136.         m_arPinList.Add(stType);
  137.         strcpy(stType.TypeName,"16 Pin");
  138.         stType.TypeVal = 16;
  139.         m_arPinList.Add(stType);
  140.         strcpy(stType.TypeName,"28 Pin");
  141.         stType.TypeVal = 28;
  142.         m_arPinList.Add(stType);
  143.         strcpy(stType.TypeName,"32 Pin");
  144.         stType.TypeVal = 32;
  145.         m_arPinList.Add(stType);
  146.         strcpy(stType.TypeName,"40 Pin");
  147.         stType.TypeVal = 40;
  148.         m_arPinList.Add(stType);

  149.         strcpy(stType.TypeName,"8 bit");
  150.         stType.TypeVal = 8;
  151.         m_arDataWidthList.Add(stType);
  152.         strcpy(stType.TypeName,"16 bit");
  153.         stType.TypeVal = 16;
  154.         m_arDataWidthList.Add(stType);
  155.         strcpy(stType.TypeName,"32 bit");
  156.         stType.TypeVal = 32;
  157.         m_arDataWidthList.Add(stType);

  158.         strcpy(stType.TypeName,"DIP");
  159.         stType.TypeVal = 1;
  160.         m_arPackageList.Add(stType);
  161.         strcpy(stType.TypeName,"SOP");
  162.         stType.TypeVal = 2;
  163.         m_arPackageList.Add(stType);
  164.         strcpy(stType.TypeName,"SSOP");
  165.         stType.TypeVal = 3;
  166.         m_arPackageList.Add(stType);
  167.         strcpy(stType.TypeName,"TSSOP");
  168.         stType.TypeVal = 4;
  169.         m_arPackageList.Add(stType);

  170.         strcpy(stType1.TypeName,"5.00V");
  171.         stType1.TypeVal = 5.00;
  172.         m_arVCCList.Add(stType1);
  173.         strcpy(stType1.TypeName,"3.30V");
  174.         stType1.TypeVal = 3.30;
  175.         m_arVCCList.Add(stType1);

  176.         strcpy(stType1.TypeName,"0.00V");
  177.         stType1.TypeVal = 0.00;
  178.         m_arVPPList.Add(stType1);
  179.         strcpy(stType1.TypeName,"12.00V");
  180.         stType1.TypeVal = 12.00;
  181.         m_arVPPList.Add(stType1);
  182.         strcpy(stType1.TypeName,"14.00V");
  183.         stType1.TypeVal = 14.00;
  184.         m_arVPPList.Add(stType1);

  185.         strcpy(stType.TypeName,"NONE");
  186.         stType.TypeVal = 1;
  187.         m_arAdapterList.Add(stType);
  188.         strcpy(stType.TypeName,"SOP8toDIP8");
  189.         stType.TypeVal = 2;
  190.         m_arAdapterList.Add(stType);
  191.         strcpy(stType.TypeName,"SOP16toDIP8");
  192.         stType.TypeVal = 3;
  193.         m_arAdapterList.Add(stType);
  194.         strcpy(stType.TypeName,"TSSOP14toDIP8");
  195.         stType.TypeVal = 4;
  196.         m_arAdapterList.Add(stType);
  197.         }

  198. }
复制代码

今天先到这里,又得忙了,欢迎有兴趣的加入,详细的请下载源代码,篇幅有限不一定讲解清楚。下节更精彩。









欢迎光临 DIY编程器网 (http://diybcq.com/) Powered by Discuz! X3.2