⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myapp1dlg.cpp

📁 上位机软件 for 自制AT89C51/52编程器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
      ei++;
    }
    DWORD CpuType,NonBlankLen,SetLen;
    sscanf(str,"p%u,%u,%u",&CpuType,&NonBlankLen,&SetLen);
//  DisplayMessage("[",0);DisplayMessage(ttt);DisplayMessage("]",0);
//  DisplayMessage(str);
    if(NonBlankLen==0)
    {
      DisplayMessage("空白芯片!");
      ReadButton->EnableWindow();
      WButton->EnableWindow();
      return;
    }else
    if(NonBlankLen<plen)
    {
      plen=NonBlankLen;
      if(!SetLength(plen))
      {
        DisplayMessage("设定程序长度超时!");
        ReadButton->EnableWindow();
        WButton->EnableWindow();
        return;
      };
    }
    sprintf(str,"长度:%u字节。",plen);
    DisplayMessage(str);
  //  DisplayMessage(plen);
  //
  }
  com.ClearRecvBuff();
  HANDLE RFile=CreateFile(m_edit3,GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  if(RFile==INVALID_HANDLE_VALUE)
  {
    //AfxMessageBox( "GetLastError()");
    DisplayMessage("创建文件"+m_edit3+"失败!");
    ReadButton->EnableWindow();
    WButton->EnableWindow();
    return;
  }
  DWORD nNumberOfBytesToWrite=1;
  LPDWORD lpNumberOfBytesWritten=&nNumberOfBytesToWrite;
  char c='r';
  com.Write(&c,1);
  c=0;
  do{
    if(!GetOneChar(&c))
    {
      DisplayMessage("读命令不响应!");
      CloseHandle(RFile);
      ReadButton->EnableWindow();
      WButton->EnableWindow();
      return;
    }
  }while(c!='r');
  DisplayMessage("读取程序 ... ...");
  for(DWORD i=0;i<plen;i++)
  {
    if(!GetOneChar(str))
    {
      DisplayMessage("读取超时!");
      CloseHandle(RFile);ReadButton->EnableWindow();
      WButton->EnableWindow();
      return;
    }
    if(!GetOneChar(str+1))
    {
      DisplayMessage("读取超时!");
      CloseHandle(RFile);
      ReadButton->EnableWindow();
      WButton->EnableWindow();
      return;
    }
    str[0]>='A'?str[0]-='A'-10:str[0]-='0';
    str[1]>='A'?str[1]-='A'-10:str[1]-='0';
    str[0]=(str[0]<<4)|str[1];
    if(WriteFile(RFile,str,nNumberOfBytesToWrite,lpNumberOfBytesWritten,NULL)==NULL)
    {
      DisplayMessage("写文件"+m_edit3+"失败!");
      CloseHandle(RFile);
      ReadButton->EnableWindow();
      WButton->EnableWindow();
      return;
    }
    m_nProgress.SetPos(100*(i+1)/plen);
  }
  CloseHandle(RFile);
  DisplayMessage("读取完成。");
  DisplayMessage("保存为 "+m_edit3);
  ReadButton->EnableWindow();
  WButton->EnableWindow();
  m_nProgress.SetPos(0);

}

void CMYAPP1Dlg::OnButton2() //write
{
  // TODO: Add your control notification handler code here
  CButton*  ReadButton=(CButton*)GetDlgItem(IDC_BUTTON4);
  CButton*  WButton=(CButton*)GetDlgItem(IDC_BUTTON2);
  WButton->EnableWindow(FALSE);
  ReadButton->EnableWindow(FALSE);
  //AfxGetMainWnd()->EnableWindow(FALSE);
  HANDLE WFile=CreateFile(m_edit2,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  if(WFile==INVALID_HANDLE_VALUE)
  {
    //AfxMessageBox( "GetLastError()");
    DisplayMessage("打开文件"+m_edit2+"失败!");
    WButton->EnableWindow();
    ReadButton->EnableWindow();
    return;
  }
  DWORD plen,plen2,SetLen;
  switch(m_radio1)
  {
  case 0: plen=2048;  break;
  case 1: plen=4096;  break;
  case 2: plen=4096*1;break;
  case 3: plen=4096*2;break;
  case 4: plen=4096*5;break;
  default:plen=4096*1;break;
  }
    if(!SetLength(plen))
  {
    DisplayMessage("设定芯片长度超时!");
    WButton->EnableWindow();
    ReadButton->EnableWindow();
    return;
  };
   
  com.ClearRecvBuff();
  //查空和擦除
  char str[60],EraseNumber=0,c;
  DWORD NonBlankLen=1,CpuType;
  while(NonBlankLen && EraseNumber++<10)
  {
    com.ClearRecvBuff();
    sprintf(str,"第%u次擦除...",EraseNumber);
    DisplayMessage(str);
    com.ClearRecvBuff();
    c='e';
    com.Write(&c,1);
    if(com.GetStrWait(str,10)<10 || _stricmp(str,"e\n\r ok\n\r >")!=0)
    {
      DisplayMessage("擦除超时!");
      CloseHandle(WFile);
      WButton->EnableWindow();
      ReadButton->EnableWindow();
      return;
    }
    //DisplayMessage(str);AfxGetMainWnd()->EnableWindow();return;
	if(m_radio1>1)
	{
    sprintf(str,"第%u次查空...",EraseNumber);
    DisplayMessage(str);
    com.ClearRecvBuff();
    c='p';
    com.Write(&c,1);
    if(com.GetStrWait(str,10,6000)<10)
    {
      DisplayMessage("查空超时!");
      CloseHandle(WFile);
      WButton->EnableWindow();
      ReadButton->EnableWindow();
      return;
    }
    int ei;   
    while(str[strlen(str)-1]!='>' || ei>20)
    {
      if(!com.GetCharWait(&c))
      {
        DisplayMessage("查空超时!");
        CloseHandle(WFile);
        WButton->EnableWindow();
        ReadButton->EnableWindow();
        return;
      }
      char l=strlen(str);
      str[l]=c;
      str[l+1]='\0';
      ei++;
    }
    sscanf(str,"p%u,%u,%u",&CpuType,&NonBlankLen,&SetLen);
	}
	else if(m_radio1==0)
	{
		NonBlankLen=0;
		DisplayMessage("2051对擦除不作检查!");
	}
	else
	{
		NonBlankLen=0;
		DisplayMessage("4051对擦除不作检查!");
	}
  }//查空和擦除结束
  if(EraseNumber>=10)
  {
    DisplayMessage("无法擦除!");
    CloseHandle(WFile);
    WButton->EnableWindow();
    ReadButton->EnableWindow();
    return;
  };
  plen=GetFileSize(WFile,&plen2);
  sprintf(str,"程序长度:%u字节。",plen);
  DisplayMessage(str);
  if(plen>SetLen)
  {
    DisplayMessage("文件程序长度错误!");
    CloseHandle(WFile);
    WButton->EnableWindow();
    ReadButton->EnableWindow();
    return;
  };
    if(!SetLength(plen))
  {
    DisplayMessage("设定程序长度超时!");
    CloseHandle(WFile);
    WButton->EnableWindow();
    ReadButton->EnableWindow();
    return;
  };


  //写
  com.ClearRecvBuff();
  c='w';
  com.Write(&c,1);
  do{
    if(!com.GetCharWait(&c))
    {
      DisplayMessage("写命令不响应!");
      CloseHandle(WFile);
      WButton->EnableWindow();
      ReadButton->EnableWindow();
      return;
    }
    //DisplayMessage("<",0);DisplayMessage(c);DisplayMessage(">",0);
  }
  while(c!='w');

  DWORD i=0;
  DWORD nNumberOfBytesToRead=1;
  LPDWORD lpNumberOfBytesRead=&nNumberOfBytesToRead;
  DisplayMessage("写程序... ...");
  while(i<plen)
  {
    if(!com.GetCharWait(&c))
    {
      DisplayMessage("写超时!");
      CloseHandle(WFile);
      WButton->EnableWindow();
      ReadButton->EnableWindow();
      return;
    };
    //DisplayMessage(c);
    if(c==XON)
    {
      if(!ReadFile(WFile,str,nNumberOfBytesToRead,lpNumberOfBytesRead,NULL))
      {
        DisplayMessage("读文件失败!");
        CloseHandle(WFile);
        WButton->EnableWindow();
        ReadButton->EnableWindow();
        return;
      };
      com.Write(str,1);
      i++;
      m_nProgress.SetPos(100*(i+1)/plen);
    }
    else if(c==XOFF)
    {
      Sleep(10);
    }
    else
    {
      DisplayMessage("写无应答!");
      CloseHandle(WFile);
      WButton->EnableWindow();
      ReadButton->EnableWindow();
      return;
    }
    
  }//END while(i<plen)

  //DisplayMessage(plen);
  //sprintf(str,"%u,%u,%u",CpuType,NonBlankLen,SetLen);
  //DisplayMessage(str);
//  char str[100];
//  com.ReadString(str, 100);
//  
  CloseHandle(WFile);
//开始校验
  //
  com.ClearRecvBuff();
  WFile=CreateFile(m_edit2,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  if(WFile==INVALID_HANDLE_VALUE)
  {
    DisplayMessage("校验读文件"+m_edit2+"失败!");
    WButton->EnableWindow();
    ReadButton->EnableWindow();
    return;
  }
  nNumberOfBytesToRead=1;
  lpNumberOfBytesRead=&nNumberOfBytesToRead;

  c='r';
  com.Write(&c,1);
  c=0;
  do{
    if(!GetOneChar(&c))
    {
      DisplayMessage("校验读命令不响应!");
      CloseHandle(WFile);
      WButton->EnableWindow();
      ReadButton->EnableWindow();
      return;
    }
  }while(c!='r');
  DisplayMessage("校验程序 ... ...");
  for(i=0;i<plen;i++)
  {
    if(!GetOneChar(str))
    {
      DisplayMessage("校验读取超时!");
      CloseHandle(WFile);WButton->EnableWindow();
      ReadButton->EnableWindow();
      return;
    }
    if(!GetOneChar(str+1))
    {
      DisplayMessage("校验读取超时!");
      CloseHandle(WFile);
      WButton->EnableWindow();
      ReadButton->EnableWindow();
      return;
    }
    str[0]>='A'?str[0]-='A'-10:str[0]-='0';
    str[1]>='A'?str[1]-='A'-10:str[1]-='0';
    str[0]=(str[0]<<4)|str[1];
    if(!ReadFile(WFile,str+3,nNumberOfBytesToRead,lpNumberOfBytesRead,NULL))
    {
      DisplayMessage("校验读文件失败!");
      CloseHandle(WFile);
      WButton->EnableWindow();
      ReadButton->EnableWindow();
      return;
    };

    if(str[0]!=str[3])
    {
      DisplayMessage("校验错误!");
      CloseHandle(WFile);
      WButton->EnableWindow();
      ReadButton->EnableWindow();
      return;
    }
    m_nProgress.SetPos(100*(i+1)/plen);
  }
  DisplayMessage("校验正确!");
  CloseHandle(WFile);
  //加密
  if(m_check2)
  {
    com.ClearRecvBuff();
    DisplayMessage("加密... ...");
    c='l';
    com.Write(&c,1);
    if(com.GetStrWait(str,10)<10 || _stricmp(str,"l\n\r ok\n\r >")!=0)
    {
      DisplayMessage("加密超时!");
      CloseHandle(WFile);
      WButton->EnableWindow();
      ReadButton->EnableWindow();
      return;
    }
    DisplayMessage("加密完成!");
  }
  DisplayMessage("写程序"+m_edit2+"成功。");  
  WButton->EnableWindow();
  ReadButton->EnableWindow();
  m_nProgress.SetPos(0);
  return;
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -