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

📄 tclupdatedlg.cpp

📁 使用串口进行双机对拷,在两台设备间连上串口线即可
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -