📄 tclupdatedlg.cpp
字号:
fp = fopen(fname,"rb");
if ( fp == NULL )
{
AfxMessageBox("文件打开错!",MB_OK|MB_ICONSTOP);
return;
}
if ( buf == NULL )
{
buf = (BYTE *)malloc(65536);
if ( buf == NULL )
{
AfxMessageBox("内存分配错!",MB_OK|MB_ICONSTOP);
fclose(fp);
return;
}
}
fseek(fp, 0L, SEEK_SET);
DWORD crc;
int i,j=0;
GetLoaderE2PromInfo();
for ( i = 0; i < LOADER_INFO_SIZE; i++ )
crc_buf[j++] = loaderinfobuf[i];
for ( i = 0,j = LOADER_INFO_SIZE; i < TOTAL_BLOCKS; i++,j+=4 )
{
fread(buf, 1, FlashBlockSize[i], fp);
crc = CalculateCRC(buf, FlashBlockSize[i]);
crc_buf[j] = (BYTE)(crc & 0xff );
crc_buf[j+1] = (BYTE)((crc >> 8) & 0xff);
crc_buf[j+2] = (BYTE)((crc >> 16 ) & 0xff);
crc_buf[j+3] = (BYTE)((crc >> 24 ) & 0xff);
}
crc = CalculateCRC(crc_buf, TOTAL_BLOCKS*4+LOADER_INFO_SIZE);
crc_buf[j] = (BYTE)(crc & 0xff );
crc_buf[j+1] = (BYTE)((crc >> 8) & 0xff);
crc_buf[j+2] = (BYTE)((crc >> 16 ) & 0xff);
crc_buf[j+3] = (BYTE)((crc >> 24 ) & 0xff);
GetDlgItem(IDC_START_SEND)->EnableWindow(TRUE);
}
}
}
UINT ReadFromFile( LPVOID pParam )
{
cnComm *m_comport = (cnComm *)pParam;
size_t size;
int errnum = 0;
char mess[100];
stcMess->SetWindowText("等待接收方应答...");
//while(!ReceivedResponse);
stcMess->SetWindowText("得到接收方的应答!!!!!");
/*FILE *ffp=fopen("e:\\yyy.dat","wb");
fwrite(crc_buf,1,(TOTAL_BLOCKS+1) * 4 + LOADER_INFO_SIZE,ffp);
fclose(ffp);*/
while( !CRC_ReceiveOk )
{
if ( ReReadCRCdataBegin )
{
m_comport->Write(crc_buf, (TOTAL_BLOCKS+1) * 4 + LOADER_INFO_SIZE);
Sleep(DELAY_TIME);
ReReadCRCdataBegin = false;
}
}
// Sleep(5000);
//CRC_ReceiveOk = false;
//ReReadCRCdataBegin = true;
time(&time1);
stcMess->SetWindowText("正在发送,请不要中止...");
fseek(fp, 0L, SEEK_SET);
int step = 32;
fread(buf, 1, 65536, fp);
Sleep(30);
m_comport->Write(buf, FlashBlockSize[ReceivedBlockNum]);
Sleep(DELAY_TIME);
WaitForResponse = true;
while( !TransFinished )
{
if ( WaitForResponse ) continue;
if ( !ReceivedOk )
{
m_comport->Write(buf, FlashBlockSize[ReceivedBlockNum]);
WaitForResponse = true;
}
else
{
fread(buf, 1, FlashBlockSize[ReceivedBlockNum]/*65536*/, fp);
Sleep(30);
m_comport->Write(buf, FlashBlockSize[ReceivedBlockNum]);
WaitForResponse = true;
}
Sleep(DELAY_TIME);
}
return 0;
}
UINT SendHandshakeToReceiver( LPVOID pParam )
{
cnComm *m_comport = (cnComm *)pParam;
time_t start,finish;
double elapsed_time;
BYTE command;
command = REQUEST_ANOTHER_READY_RECEIVE;
m_comport->Write(&command, 1);
time( &start );
while( !ReceivedResponse )
{
m_comport->Write(&command, 1);
Sleep(100);
time( &finish );
elapsed_time = difftime( finish, start );
if ( elapsed_time >= 135.0 )
{
stcMess->SetWindowText("已向接收方发握手信号但未收到回应!");
break;
}
}
//stcMess->SetWindowText("得到接收方的应答!!!!!");
return 0;
}
void CTclupdateDlg::OnStartSend()
{
GetDlgItem(IDC_START_SEND)->EnableWindow(FALSE);
GetDlgItem(IDC_BROWSE)->EnableWindow(FALSE);
ReceivedBlockNum = 0;
fseek(fp,0L,SEEK_SET);
CRC_ReceiveOk = false;
ReReadCRCdataBegin = true;
TransFinished = false;
ReceivedOk = false;
ReDispMyMess = false;
GetDlgItem(IDC_MESS)->SetWindowText("准备发送数据...");
#if 0
tmpthread = AfxBeginThread(SendHandshakeToReceiver, &m_ComPort);
if ( tmpthread == NULL )
{
AfxMessageBox("建立临时线程失败!",MB_OK|MB_ICONSTOP);
return;
}
else SetThreadPriority( tmpthread, THREAD_PRIORITY_ABOVE_NORMAL );
#endif
// CWinThread* mythread = NULL;
mythread = AfxBeginThread(ReadFromFile, &m_ComPort);
if ( mythread == NULL )
{
AfxMessageBox("建立发送线程失败!",MB_OK|MB_ICONSTOP);
free(buf);
fclose(fp);
return;
}
else SetThreadPriority( mythread, THREAD_PRIORITY_ABOVE_NORMAL );
// else SetThreadPriority( mythread, THREAD_PRIORITY_HIGHEST );
}
UINT SendHandshakeToSender( LPVOID pParam )
{
cnComm *m_comport = (cnComm *)pParam;
time_t start,finish;
double elapsed_time;
BYTE command = GET_ANOTHER_RESPONSE;
m_comport->Write(&command, 1);
time( &start );
while( !ReceivedResponse )
{
m_comport->Write(&command, 1);
Sleep(100);
time( &finish );
elapsed_time = difftime( finish, start );
if ( elapsed_time >= 135.0 )
{
stcMess->SetWindowText("已向接收方发握手信号但未收到回应!");
break;
}
}
//stcMess->SetWindowText("得到接收方的应答!!!!!");
return 0;
}
LRESULT CTclupdateDlg::OnReceivedMessage(WPARAM wParam,LPARAM lParam)
{
int k;
BYTE InBuf[1024], command;
Sleep(160);
if ( ActAsSender )
{
k = m_ComPort.Read(InBuf, 1024);
if ( k > 0 )
{
char mess[100];
switch(InBuf[0])
{
case RECEIVE_OK:
ReceivedBlockNum++;
if ( ReceivedBlockNum >= TOTAL_BLOCKS )
{
TransFinished = true;
stcMess->SetWindowText("发送完毕!");
m_progress.ShowWindow(SW_HIDE);
time(&time2);
sprintf(mess,"发送完成!(共用时%.1f分钟)",difftime(time2,time1)/60.0);
GetDlgItem(IDC_MESS)->SetWindowText(mess);
AfxMessageBox("发送完成!",MB_OK);
}
else
{
if ( ReDispMyMess )
{
sprintf(mess,"正在发送,请不要中止...%d",ReceivedBlockNum);
stcMess->SetWindowText(mess);
ReDispMyMess = false;
}
else
{
sprintf(mess,"正在发送,请不要中止...%d",ReceivedBlockNum);
stcMess->SetWindowText(mess);
}
}
m_progress.StepIt();
ReceivedOk = true;
WaitForResponse = false;
break;
case START_RE_READ:
ReceivedOk = false;
WaitForResponse = false;
ReDispMyMess = true;
sprintf(mess, "发送块%d出错!将试图重新发送该块",ReceivedBlockNum);
GetDlgItem(IDC_MESS)->SetWindowText(mess);
break;
case GET_ANOTHER_RESPONSE:
ReceivedResponse = true;
break;
case CRCDATA_RECEIVEOK:
CRC_ReceiveOk = true;
m_progress.ShowWindow(SW_SHOW);
break;
case CRCDATA_RECEIVEFAIL:
ReReadCRCdataBegin = true;
break;
default:
break;
}
}
}
else //Act as receiver
{
switch(ReceiveFlag)
{
case 0:
k = m_ComPort.Read(InBuf, 1024);
if ( k > 0 )
{
char mess[100];
switch(InBuf[0])
{
case REQUEST_ANOTHER_READY_RECEIVE:
GetDlgItem(IDC_MESS)->SetWindowText("收到发送方的REQUEST_ANOTHER_READY_RECEIVE");
command = GET_ANOTHER_RESPONSE;
m_ComPort.Write(&command, 1);
ReceiveFlag = 1;
break;
case TRANS_FINISHED:
GetDlgItem(IDC_START_RECEIVE)->EnableWindow(TRUE);
GetDlgItem(ID_CANCEL)->EnableWindow(TRUE);
time(&time2);
sprintf(mess,"接收完成!(共用时%.1f分钟)",difftime(time2,time1)/60.0);
GetDlgItem(IDC_MESS)->SetWindowText(mess);
AfxMessageBox("接收完成!",MB_OK);
break;
default: break;
}
}
break;
case 1:
k = m_ComPort.Read(InBuf, 1024);
if ( k > 0 )
{
for ( int i = 0; i < k; i++ )
{
crc_buf[RevLen+i]=InBuf[i];
if ( RevLen + i >= (TOTAL_BLOCKS+1)*4+LOADER_INFO_SIZE ) break;
}
RevLen += k;
if ( RevLen >= (TOTAL_BLOCKS+1)*4 + LOADER_INFO_SIZE )
{
DWORD crc1 = CalculateCRC( crc_buf, TOTAL_BLOCKS*4+LOADER_INFO_SIZE );
DWORD crc2 = ( crc_buf[TOTAL_BLOCKS*4+LOADER_INFO_SIZE+3] << 24) |
( crc_buf[TOTAL_BLOCKS*4+LOADER_INFO_SIZE+2] << 16) |
( crc_buf[TOTAL_BLOCKS*4+LOADER_INFO_SIZE+1] << 8) |
crc_buf[TOTAL_BLOCKS*4+LOADER_INFO_SIZE];
RevLen = 0;
if ( crc1 != crc2 )
{
GetDlgItem(IDC_MESS)->SetWindowText("收完crc_buf,但校验失败,须重新接收!");
command = CRCDATA_RECEIVEFAIL;
m_ComPort.Write(&command, 1);
}
else
{
for ( int i = 0; i < TOTAL_BLOCKS; i++ )
{
right_crc[i] = ( crc_buf[i*4+LOADER_INFO_SIZE+3] << 24) |
( crc_buf[i*4+LOADER_INFO_SIZE+2] << 16) |
( crc_buf[i*4+LOADER_INFO_SIZE+1] << 8) |
crc_buf[i*4+LOADER_INFO_SIZE];
}
GetDlgItem(IDC_MESS)->SetWindowText("收完crc_buf,且校验成功!");
ReceiveFlag = 2;
m_progress.ShowWindow(SW_SHOW);
command = CRCDATA_RECEIVEOK;
m_ComPort.Write(&command, 1);
}
}
}
break;
case 2:
k = m_ComPort.Read(InBuf, 1024);
if ( k > 0 )
{
for ( int i = 0; i < k; i++ )
{
buf[RevLen+i]=InBuf[i];
if ( RevLen + i >= FlashBlockSize[ReceivedBlockNum]/*65536*/ ) break;
}
RevLen += k;
if ( RevLen >= FlashBlockSize[ReceivedBlockNum]/*65536*/ )
{
char mess[200];
DWORD crc = CalculateCRC( buf, FlashBlockSize[ReceivedBlockNum]/*65536*/ );
if ( crc == right_crc[ReceivedBlockNum] )
{
fwrite(buf, 1, FlashBlockSize[ReceivedBlockNum]/*65536*/, fp);
sprintf(mess,"收完buf[%d],且校验成功!",ReceivedBlockNum);
ReceivedBlockNum++;
if ( ReceivedBlockNum >= TOTAL_BLOCKS )
{
sprintf(mess,"全部数据收完,且校验成功!");
ReceiveFlag = 0;
}
command = RECEIVE_OK;
m_ComPort.Write(&command, 1);
}
else
{
sprintf(mess,"收完buf[%d],但校验失败(crc=%08x)!",ReceivedBlockNum,crc);
command = START_RE_READ;
m_ComPort.Write(&command, 1);
}
GetDlgItem(IDC_MESS)->SetWindowText(mess);
RevLen = 0;
m_progress.StepIt();
}
}
break;
}
}
return 0;
}
HBRUSH CTclupdateDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if ( nCtlColor == CTLCOLOR_DLG )
hbr = m_BackgroundBrush;
return hbr;
}
void CTclupdateDlg::OnBnClickedCancel()
{
if ( buf != NULL ) free(buf);
if ( fp != NULL ) fclose(fp);
CTclupdateDlg::OnCancel();
}
void CTclupdateDlg::OnSelchangeComboPort()
{
int comx = m_comboPort.GetCurSel() + 1;
char ss[100];
if ( comx == ComX )
{
sprintf(ss,"串口COM%d已经打开!", ComX);
AfxMessageBox(ss,MB_OK|MB_ICONSTOP);
return;
}
if(m_ComPort.IsOpen()) m_ComPort.Close();
m_ComPort.Open(ComX, 115200);
}
void CTclupdateDlg::OnCheck1()
{
ActAsSender = !ActAsSender;
if ( !ActAsSender )
{
GetDlgItem(IDC_START_RECEIVE)->EnableWindow(TRUE);
GetDlgItem(IDC_START_SEND)->EnableWindow(FALSE);
GetDlgItem(IDC_BROWSE)->EnableWindow(FALSE);
GetDlgItem(IDC_FNAME)->SetWindowText("接收的数据将记录到f:\\update1.dat");
}
else
{
GetDlgItem(IDC_START_RECEIVE)->EnableWindow(FALSE);
if ( fname[0] != '\0' )
{
GetDlgItem(IDC_START_SEND)->EnableWindow(TRUE);
GetDlgItem(IDC_FNAME)->SetWindowText(fname);
}
else GetDlgItem(IDC_FNAME)->SetWindowText("");
GetDlgItem(IDC_BROWSE)->EnableWindow(TRUE);
}
}
void CTclupdateDlg::OnStartReceive()
{
GetDlgItem(IDC_START_RECEIVE)->EnableWindow(FALSE);
fp = fopen("f:\\update1.dat","wb");
if ( fp == NULL )
{
AfxMessageBox("文件打开错!",MB_OK|MB_ICONSTOP);
return;
}
if ( buf == NULL )
{
buf = (BYTE *)malloc(65536);
if ( buf == NULL )
{
AfxMessageBox("内存分配错!",MB_OK|MB_ICONSTOP);
fclose(fp);
return;
}
}
ReceivedBlockNum = 0;
time(&time1);
GetDlgItem(IDC_MESS)->SetWindowText("准备接收数据...");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -