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

📄 downloderdlg.cpp

📁 vc++编写的adu812下载程序源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		     buffer3[0]=0x07;
			 buffer3[1]=0x0e;
			 buffer3[3]=0x45;
			 chknum+=0x45;
			 buffer3[4]=0x00;
		     for(int ii=0;ii<lencount;ii++)
			  {
               if(pFile[ii]==':')
			   {
				num++;
			    if(num==team)
				{
			    bytes=pt->ASCtoHEX(pFile[ii+1],pFile[ii+2]);

		        buffer3[2]=bytes+4;
                chknum+=buffer3[2];
                buffer3[5]=pt->ASCtoHEX(pFile[ii+3],pFile[ii+4]);
                chknum+=buffer3[5]; 
                buffer3[6]=pt->ASCtoHEX(pFile[ii+5],pFile[ii+6]);
                chknum+=buffer3[6]; 
				for(int n=0;n<bytes;n++)
				{
                 buffer3[7+n]=pt->ASCtoHEX(pFile[ii+9+2*n],pFile[ii+9+(2*n+1)]);  
                 chknum+=buffer3[7+n];
				}
				 break;
				}
			   }
			  }
              buffer3[7+bytes]=0x100-chknum;

              pt->WriteComm(buffer3,bytes+8);
             
           // strcpy(m_data,"trruyADI 812   V201");///////////////
           // m_data[19]=0x06;///////////////////////////////////
              ok_program=TRUE;
              sumlength=0;
              timenum=0;

            do{
 
              strncpy(tempbuf,m_data,sumlength);

                for(int k=0;k<sumlength;k++)
				{
 
	             if(tempbuf[k]==0x06){ 
		          ok_program=FALSE;
                  sumlength=0;
		            break;
				 }
                  if(tempbuf[k]==0x07) {
		           pt->GetDlgItem(IDC_STATE)->SetWindowText("编程错误 !");
                  return FALSE;
				  }
				}
              if(timenum>10){
	          pt->GetDlgItem(IDC_STATE)->SetWindowText("编程错误 !");
              pt->m_progress.SetPos(0);
	          return FALSE;
			  }
			}while(ok_program);
         


		     team++;
             m_nProgress+=1;//进度加1
             pt->m_progress.SetPos (m_nProgress);
             framecount--;
	   }

		  ::GlobalUnlock(hFile);
	      ::GlobalFree(hFile);
          
           pt->m_progress.SetPos(0);
           pt->GetDlgItem(IDC_STATE)->SetWindowText(" 编程成功!");

           return TRUE;
}



///////////////////////////////////////////////////////////////////
void CDownloderDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
    okdata=FALSE;
	if( comThread!=NULL)
	{
     Exitcom();
	}
	if(m_osRead.hEvent)
	CloseHandle(m_osRead.hEvent);

	if(m_osWrite.hEvent)
    CloseHandle(m_osWrite.hEvent);
	CDialog::OnCancel();
}



void CDownloderDlg::OnDblclkDirlist() 
{
	// TODO: Add your control notification handler code here
char *strDir;
m_dirlist.GetText(m_dirlist.GetCurSel(),strBufd);
strDir=new char[strlen(strBufd)-1];
strncpy(strDir,strBufd+1,strlen(strBufd)-2);
strDir[strlen(strBufd)-2]='\0';
if(strDir[0]=='-'){
	if(_chdrive(strDir[1]-'a'+1)){
		MessageBox("Drive Error!");
		delete []strDir;
		return;
	}
}
else

if(_chdir(strDir)){
 MessageBox(" Dir Error!");
		delete []strDir;
		return;
	
}
getcwd(strBufd,256);
GetDlgItem(IDC_DIRTEXT)->SetWindowText(strBufd);
m_dirlist.ResetContent();
m_dirlist.Dir (DDL_DRIVES|DDL_DIRECTORY|DDL_EXCLUSIVE,"*.*");

m_filelist.ResetContent();
m_filelist.Dir(DDL_READWRITE|DDL_ARCHIVE,"*.*");

delete []strDir; 	
}

void CDownloderDlg::OnSelchangeFilelist() 
{
	// TODO: Add your control notification handler code here
    char strBuff[256];
    strcpy(strBuf,strBufd);
    m_filelist.GetText(m_filelist.GetCurSel(),strBuff);
	strcat(strBuf,"\\");
	strcat(strBuf,strBuff);
    GetDlgItem(IDC_DIRTEXT)->SetWindowText(strBuf);
  	
}

int CDownloderDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	 memset(&m_osRead,0,sizeof(OVERLAPPED));
     m_osRead.hEvent=NULL;
     if((m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL)
		 return FALSE;

	 
	 memset(&m_osWrite,0,sizeof(OVERLAPPED));
     m_osWrite.hEvent=NULL; 
	 if((m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL)
		 return FALSE;

     initserialport();
     m_nTimer=SetTimer(1,1000,NULL);
	return 0;
}
int CDownloderDlg::initserialport()
{
    DCB dcb;
	hCommDev=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,
		0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
	if(	hCommDev==(HANDLE)-1)
	{
		MessageBox("串口初始化失败");
		return TRUE;
	}
    if(!GetCommState(hCommDev,&dcb))
		return FALSE;

	dcb.BaudRate=9600;
	dcb.ByteSize=8;
	dcb.fBinary=TRUE;
	dcb.fParity=FALSE;
	dcb.Parity=NOPARITY;

	dcb.StopBits=ONESTOPBIT;
	
	//unenable software flow control
    dcb.fInX=dcb.fOutX=FALSE;
    //com port 4--6;7--8;2--3;3--2;GND--GND
	//send-hardware flow control
    dcb.fRtsControl=RTS_CONTROL_TOGGLE;
	dcb.fOutxCtsFlow=TRUE;


	//reception-hardware flow control
	dcb.fDtrControl=DTR_CONTROL_HANDSHAKE;
	dcb.fDsrSensitivity=TRUE;
    
    SetCommState(hCommDev,&dcb);

	COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout=MAXWORD;
	CommTimeOuts.ReadTotalTimeoutConstant=0;
    CommTimeOuts.ReadTotalTimeoutMultiplier=0;
    CommTimeOuts.WriteTotalTimeoutConstant=50;
    CommTimeOuts.WriteTotalTimeoutMultiplier=2000;
 
    SetCommTimeouts(hCommDev,&CommTimeOuts);
    SetCommMask(hCommDev,EV_RXCHAR);
   
    
    SetupComm(hCommDev,MAXBLOCK,MAXBLOCK);
   

   comThread=AfxBeginThread(CommWatchThread,this,
	   THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);

	if(comThread!=NULL)	comThread->ResumeThread();
	else  MessageBox("线程创建失败!");


    return  0;
}
int CDownloderDlg:: Exitcom()
{
 m_Break=FALSE;
 SetCommMask(hCommDev,0);
  
 WaitForSingleObject(comThread->m_hThread,INFINITE);
 comThread=NULL;
 PurgeComm(hCommDev,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR
	 |PURGE_RXCLEAR);
 CloseHandle(hCommDev);
 return 0;
}
UINT CommWatchThread(LPVOID pParam)
{
    OVERLAPPED os;
	DWORD dwMask;

    DWORD dwLength,dwBytesRead;
    COMSTAT ComStat;
    DWORD  dwErrorFlags;

   unsigned char strRecvBuf[MAXBLOCK/4];


	memset(&os,0,sizeof(OVERLAPPED));
    os.hEvent=NULL;
	os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

	if(os.hEvent==NULL)
	{
		AfxMessageBox("Can't create event object!");
			return(UINT)-1;
	}

         SetCommMask(hCommDev,EV_RXCHAR);
         PurgeComm(hCommDev,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR
			 |PURGE_RXCLEAR);

	while(m_Break){         //*
		  
	
           dwMask=0;
           
	       WaitCommEvent(hCommDev,&dwMask,&os);
		 
		   if((dwMask&EV_RXCHAR)==EV_RXCHAR)  //**
		   {
		  
			 do{

              ClearCommError(hCommDev,&dwErrorFlags,&ComStat);
              dwLength=ComStat.cbInQue;
			  
             if(dwLength>0)//***
			 {
            
             BOOL fReadStat=ReadFile(hCommDev,strRecvBuf,dwLength,&dwLength,&m_osRead);

             if (!fReadStat){

              if(GetLastError()==ERROR_IO_PENDING)
			  {
                while(!GetOverlappedResult(hCommDev,&m_osRead,&dwBytesRead,TRUE))
			   {
                    if(GetLastError()==ERROR_IO_INCOMPLETE)continue;
				}
			  } 
			
              else 

			  { 
				dwLength=0; 
                ClearCommError(hCommDev,&dwErrorFlags,&ComStat);
			  } 
			 }
            
               for(int lopp=0;lopp<int(dwLength);lopp++)
			   {
				sumlength++;
				m_data[sumlength]=strRecvBuf[lopp];
                
			   }
	
		

			}//****

		  }while(dwLength>0);
		 }//**

   }//*
	    CloseHandle(os.hEvent);
     	return TRUE;

}

BOOL CDownloderDlg:: WriteComm(unsigned char *buf,DWORD dwLength)
{

BOOL fState;
DWORD length=dwLength;
COMSTAT ComStat;
DWORD  dwErrorFlags; 

//DWORD dwError; 

ClearCommError(hCommDev,&dwErrorFlags,&ComStat);
fState=WriteFile(hCommDev,buf,length,&length,&m_osWrite);
if (!fState) 
{ 
   if(GetLastError()==ERROR_IO_PENDING);
  
   else 

   {
    ClearCommError(hCommDev,&dwErrorFlags,&ComStat);
     return  FALSE ; 
   } 
} 

return  TRUE  ; 

}

void CDownloderDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent==m_nTimer){
    timenum++;
	}
	CDialog::OnTimer(nIDEvent);
}
unsigned char CDownloderDlg:: ASCtoHEX(char char1,char char2)
{
if(char1>57)char1-=55;
else char1-=0x30;
if(char2>57)char2-=55;
else char2-=0x30;

return char1*16+char2;
}

⌨️ 快捷键说明

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