📄 downloderdlg.cpp
字号:
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 + -