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

📄 lpc2xxisp.cpp.bak

📁 一款不错的关于串口升级硬件的软件
💻 BAK
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include "SCOMM.h"
#include "resource.h"
#include "FlashISPDlg.h"
//#include "..\\FrameData.h"
//#include "..\\Option.h"

#define ENCODE_BYTE(b) (((b) == 0) ? 0x60 : ((b) + 0x20))
#define MAX_LINELEN 45
#define SECTORS 27
#define SYSTEMCLK 8000

//2292适用
//UINT ThreadProgramFlash(LPVOID pParam)
//十分重要:每次读之前先把实际读的数目赋为0,否则会出问题!!!!!!!!!!!!!!!!!!!!!!!!
UINT ThreadProgramFlash(LPVOID pParam)
{
//	CSerial* pComm=(CSerial *)pParam;
	CFlashISPDlg *pDlg = (CFlashISPDlg *)pParam;
	CProgressCtrl *pDownProgress = (CProgressCtrl*)pDlg->GetDlgItem(IDC_UPDATEPROGRESS);
	pDownProgress->SetPos(0);
	char		str1[50]="Synchronized\r\n";
	char		stt[100];
	
    	if(pDlg->m_ComPort.IsRunning())
     	{
			AfxMessageBox("串口错误!");
			return 1;
		}
		else
		{
			pDlg->m_ComPort.SetRunning(true);
		}
	
	int		linelen;
	int		linecnt;
	char	outbuf[100];
	int		iSect=0;
	DWORD	xLen,rLen;
	CFile	file;
	if(file.Open("D:\\SANY.bin",CFile::modeRead,NULL)==NULL)
	{
		AfxMessageBox("BIN文件打开失败!");
		CWnd* pnd=pDlg->GetDlgItem(IDOK);
		pnd->SetWindowText("开始");
		pDlg->m_ComPort.Close();
		return 1;
	}
 	xLen=file.GetLength();
	BYTE	*sBuf=(BYTE*)GlobalAlloc(LMEM_FIXED,xLen+3);
	sBuf[xLen]=0;
	sBuf[xLen+1]=0;
	sBuf[xLen+2]=0;
	if(sBuf==NULL)
	{
		file.Close();
		AfxMessageBox("分配内存失败!");
		return 1;
	}
	if(file.Read(sBuf,xLen)!=xLen)
	{
		file.Close();
		AfxMessageBox("读文件失败!");
		return 1;
	}
	file.Close();
	
	DWORD	tPos=0;
	DWORD	rCnt=0;
	DWORD	iPos=0;
	DWORD	xCrc=0;
	int		oPos=0;
	DWORD	ixx;
	//////////////////////////////////
	
	
	int step;
	//使进入ISP状态
	pDlg->m_CStrPrompt.Empty();
	pDlg->m_CStrPrompt = "正在复位接头...";
//	pDlg->UpdateData(TRUE);
	pDlg->SendMessage(WM_MYUPDATEDATA,false);
	
	pDlg->m_ComPort.SetBaudRate(19200);
	pDlg->m_ComPort.ClearBuffer();
	Sleep(20);
	pDlg->m_ComPort.SendData((BYTE*)("\x55\xAA\x00\x00\x00\x00\xC0\x05\x68\x7f\x49\x5B"),12);
	for(step=0;step<100;step++)
	{
		pDownProgress->SetPos(step);
		Sleep(2);
	}
//	Sleep(1000);
	pDownProgress->SetPos(0);
	pDlg->m_ComPort.SetBaudRate(pDlg->m_iBaudRate);
	pDlg->m_ComPort.ClearBuffer();
	Sleep(20);
	//自动波特率
	pDlg->m_CStrPrompt.Empty();
	pDlg->m_CStrPrompt = "正在连接接头...";
	pDlg->SendMessage(WM_MYUPDATEDATA,false);
//	pDlg->UpdateData(FALSE);
	do
	{
		stt[0]=0x3F;
		pDlg->m_ComPort.SendData((BYTE*)stt,1);
		Sleep(20);
		//pComm->ReadData((BYTE*)stt,100,&tPos);
		pDlg->m_ComPort.ReadData((BYTE*)stt,strlen(str1),&tPos);
		rCnt++;
	}while(((tPos==0)||(tPos==1&&stt[0]==0x3F))&&rCnt<100);
	if(rCnt==100)
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
 	
	stt[tPos]=0;
	if(strcmp(stt,str1)!=0)
		return 1;
	
	
	
	
	/*
	//////////////////////////////////
	//	Synchronized
	//pComm->SendData((BYTE*)str1,strlen(str1));
	tPos=0;
	rCnt=0;
	memset(stt,0,sizeof(stt));
	do
	{
		pComm->SendData((BYTE*)str1,strlen(str1));
		Sleep(20);
		pComm->ReadData((BYTE*)&stt[tPos],strlen("Synchronized\r\nOK\r\n"),&iPos);
		tPos+=iPos;
		if(tPos>=strlen("Synchronized\rOK\r\n"))	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	//stt[tPos]=0;
	//memset(stt,0,sizeof(stt));
	if((strstr(stt,"\rOK")==NULL)&&(strstr(stt,"\nOK")==NULL))
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	
	
        //pComm->ClearBuffer();

	
	//////////////////////////////////
	//	8000晶振
	rCnt=0;
	tPos=0;
	memset(stt,0,sizeof(stt));
	//strcpy(str1,"12000\r\n");
	strcpy(str1,"8000\r\n");
	//pComm->SendData((BYTE*)str1,strlen(str1));
	do
	{
		//发了只是写到缓冲区,未必已经发出去
		pComm->SendData((BYTE*)str1,strlen(str1));
		
		Sleep(20);
		
		pComm->ReadData((BYTE*)&stt[tPos],strlen("8000\r\nOK\r\n"),&iPos);
		tPos+=iPos;
		if(tPos>=strlen("8000\rOK\r\n"))	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	//stt[tPos]=0;
	//if(strcmp(stt,"12000\r\nOK\r\n")!=0)
	//if(strcmp(stt,"8000\rOK\r\n")!=0)
	if((strstr(stt,"\rOK")==NULL)&&(strstr(stt,"\nOK")==NULL))
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	
	pComm->ClearBuffer();
	*/
	
	
	tPos = 0;
	memset(stt,0,sizeof(stt));
	strcpy(str1,"Synchronized\r\n");
	pDlg->m_ComPort.SendData((BYTE*)str1,strlen(str1));
	Sleep(25);
	//pComm->ReadData((BYTE*)&stt[tPos],30,&iPos);

	
	tPos = 0;
	memset(stt,0,sizeof(stt));
	strcpy(str1,"8000\r\n");
	pDlg->m_ComPort.SendData((BYTE*)str1,strlen(str1));
	Sleep(17);
	//pComm->ReadData((BYTE*)&stt[tPos],30,&iPos);
	
	tPos = 0;
	memset(stt,0,sizeof(stt));
	strcpy(str1,"J\r\n");
	pDlg->m_ComPort.SendData((BYTE*)str1,strlen(str1));
	Sleep(18);
	//pComm->ReadData((BYTE*)&stt[tPos],30,&iPos);
	
	tPos = 0;
	memset(stt,0,sizeof(stt));
	strcpy(str1,"R 1073742336 4\r\n");
	pDlg->m_ComPort.SendData((BYTE*)str1,strlen(str1));
	Sleep(40);
	//pComm->ReadData((BYTE*)&stt[tPos],50,&iPos);
	
	
	tPos = 0;
	memset(stt,0,sizeof(stt));
	strcpy(str1,"OK\r\n");
	pDlg->m_ComPort.SendData((BYTE*)str1,strlen(str1));
	Sleep(65);
	//pComm->ReadData((BYTE*)&stt[tPos],10,&iPos);
	
	tPos = 0;
	memset(stt,0,sizeof(stt));
	strcpy(str1,"U 23130\r\n");
	pDlg->m_ComPort.SendData((BYTE*)str1,strlen(str1));
	Sleep(20);
	pDlg->m_ComPort.ReadData((BYTE*)&stt[tPos],20,&iPos);
	
	
	/*
	//////////////////////////////////
	//	U 23130
	
	Sleep(50);
	
	rCnt=0;
	tPos=0;
	memset(stt,0,sizeof(stt));
	strcpy(str1,"U 23130\r\n");
	//pComm->SendData((BYTE*)str1,strlen(str1));
	do
	{
		pComm->SendData((BYTE*)str1,strlen(str1));
		Sleep(20);
		pComm->ReadData((BYTE*)&stt[tPos],strlen("U 23130\r\n0\r\n"),&iPos);
		tPos+=iPos;
		if(tPos>=strlen("U 23130\r0\r\n"))	break;
		//Sleep(5);
		rCnt++;
		tPos = 0;
	}while(rCnt<100);
	if(rCnt==100)
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	//stt[tPos]=0;
	//if(strcmp(stt,"U 23130\r0\r\n")!=0)
	if((strstr(stt,"\r0")==NULL)&&(strstr(stt,"\n0")==NULL))
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	
	pComm->ClearBuffer();
	*/


	/*
	//////////////////////////////////
	//	J
	rCnt=0;
	tPos=0;
	strcpy(str1,"J\r\n");
	pComm->SendData((BYTE*)str1,strlen(str1));
	
	Sleep(10);
	
	do
	{
		pComm->ReadData((BYTE*)&stt[tPos],50,&iPos);
		tPos+=iPos;
		Sleep(10);
		rCnt++;
	//}while(rCnt<10);
	}while(rCnt<2);
	stt[tPos]=0;
	if(stt[0]!='J'			||
		stt[1]!='\r'		||
		stt[2]!='\n'		||
		stt[3]!='0'			||
		stt[4]!='\r'		||
		stt[5]!='\n'		||
		stt[tPos-2]!='\r'	||
		stt[tPos-1]!='\n')
		return 1;
	DWORD dwHardID=0;
	for(int i=6;stt[i]!='\r';i++)
	{
		if(stt[i]>='0'&&stt[i]<='9')	dwHardID=dwHardID*10+stt[i]-'0';
		else
		{
			dwHardID=0;
			return 1;
		}
	}
	//m_HardID=dwHardID;
	//UpdateData(FALSE);
	*/
	
	
	
	///////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////
	//	擦除/烧写FLASH

	
	
	pDlg->m_ComPort.ClearBuffer();
	
	//2119与2368不一样
	//	P 0 1
	tPos=0;
	rCnt=0;
	memset(stt,0,sizeof(stt));
	sprintf(outbuf,"P 0 %d\r\n",SECTORS);
	ixx=strlen(outbuf);
	pDlg->m_ComPort.SendData((BYTE*)outbuf,ixx);
	Sleep(20);
	strcat(outbuf,"0\r\n");
	ixx+=3;
	do
	{
		//pComm->ReadData((BYTE*)&stt[tPos],100,&rLen);
		pDlg->m_ComPort.ReadData((BYTE*)&stt[tPos],ixx,&rLen);
		tPos+=rLen;
		if(tPos>=(ixx-2))	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	//stt[tPos]=0;
	//if(strcmp(stt,outbuf)!=0)
	if((strstr(stt,"\r0")==NULL)&&(strstr(stt,"\n0")==NULL))
	{
		AfxMessageBox("操作失败!");
		return 1;
	}

	pDlg->m_ComPort.ClearBuffer();

	Sleep(10);
	//	E 0 1
	tPos=0;
	rCnt=0;
	//sprintf(outbuf,"E 0 %d\r\n",(xLen-1)/8192);
	memset(stt,0,sizeof(stt));
	sprintf(outbuf,"E 0 %d\r\n",SECTORS);
	//sprintf(outbuf,"E 0 %d\r\n",0);
	ixx=strlen(outbuf);
	pDlg->m_ComPort.SendData((BYTE*)outbuf,ixx);
	Sleep(500);
	strcat(outbuf,"0\r\n");
	ixx+=3;
	do
	{
		//pComm->ReadData((BYTE*)&stt[tPos],100,&rLen);
		pDlg->m_ComPort.ReadData((BYTE*)&stt[tPos],ixx,&rLen);
		tPos+=rLen;
		if(tPos>=(ixx-2))	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	//stt[tPos]=0;
	//if(strcmp(stt,outbuf)!=0)
	if((strstr(stt,"\r0")==NULL)&&(strstr(stt,"\n0")==NULL))
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	
	pDlg->m_ComPort.ClearBuffer();
	
	
	//////////////////////////////////
	//	U 23130
	rCnt=0;
	tPos=0;
	memset(stt,0,sizeof(stt));
	strcpy(str1,"U 23130\r\n");
	//pComm->SendData((BYTE*)str1,strlen(str1));
	do
	{
		pDlg->m_ComPort.SendData((BYTE*)str1,strlen(str1));
		Sleep(30);
		pDlg->m_ComPort.ReadData((BYTE*)&stt[tPos],strlen("U 23130\r\n0\r\n"),&iPos);
		tPos+=iPos;
		if(tPos>=strlen("U 23130\r0\r"))	break;
		//Sleep(5);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	//stt[tPos]=0;
	//if(strcmp(stt,"U 23130\r0\r\n")!=0)
	if((strstr(stt,"\r0")==NULL)&&(strstr(stt,"\n0")==NULL))
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	
	pDlg->m_ComPort.ClearBuffer();
	
	
	//	W 40000200H 4096
	//	"W 1073742336 4096\r\n"
	tPos=0;
	rCnt=0;
	memset(stt,0,sizeof(stt));
	strcpy(outbuf,"W 1073742336 4096\r\n");
	ixx=strlen(outbuf);
	pDlg->m_ComPort.SendData((BYTE*)outbuf,ixx);
	Sleep(30);
	//strcat(outbuf,"0\r\n");
	strcpy(outbuf,"W 1073742336 4096\r\n0\r\n");
	ixx=strlen(outbuf);
	do
	{
		//pComm->ReadData((BYTE*)&stt[tPos],100,&rLen);
		pDlg->m_ComPort.ReadData((BYTE*)&stt[tPos],ixx,&rLen);
		tPos+=rLen;
		if(tPos>=(ixx-2))	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	//stt[tPos]=0;
	//if(strcmp(stt,outbuf)!=0)
	if((strstr(stt,"\r0")==NULL)&&(strstr(stt,"\n0")==NULL))
	{
		AfxMessageBox("操作失败!");
		return 1;
	}
	
	pDlg->m_ComPort.ClearBuffer();
	
	
	iPos=0;
	
	
	//开始发送数据(UU编码)到RAM.
	//每次W/C4096个数据
	//xLen为bin文件的总长度
	while(iPos<xLen)
	{
		if(xLen-iPos>MAX_LINELEN)
			linelen=MAX_LINELEN;
		else
			linelen=xLen-iPos;
		
		if((iPos%4096)==4095)
		{
			outbuf[oPos++]=ENCODE_BYTE(1);
//			file2.Write(outbuf,1);
			outbuf [oPos++] = ENCODE_BYTE ((sBuf[iPos] & 0xFC) >> 2);
			outbuf [oPos++] = ENCODE_BYTE ((sBuf[iPos] & 0x03) << 4);
			outbuf [oPos++] = ENCODE_BYTE (0);
			outbuf [oPos++] = ENCODE_BYTE (0);
//			outbuf [oPos++] = '\0';
			xCrc+=sBuf[iPos];
			iPos++;
			linecnt-=1;
			outbuf[oPos++]='\r';
			outbuf[oPos++]='\n';
			outbuf[oPos++]=0;
			//	+++++++++++++++++++++++++++++++++++
			//	DATA
			rCnt=0;
			tPos=0;
			ixx=strlen(outbuf);
			pDlg->m_ComPort.SendData((BYTE*)outbuf,ixx);
			Sleep(20);
			do
			{
				//pComm->ReadData((BYTE*)&stt[tPos],100,&rLen);
				pDlg->m_ComPort.ReadData((BYTE*)&stt[tPos],strlen(outbuf),&rLen);
				tPos+=rLen;
				if(tPos>=ixx)	break;
				Sleep(10);
				rCnt++;
			}while(rCnt<100);
			if(rCnt==100)
			{
				AfxMessageBox("操作失败!");
				return 1;
			}
			stt[tPos]=0;
			if(strcmp(stt,outbuf)!=0)
			{
				AfxMessageBox("操作失败!");
				return 1;
			}
			
			
			
			//	+++++++++++++++++++++++++++++++++++
			//	CRC + OK
			sprintf(outbuf,"%d\r\n",xCrc);
			pDlg->m_ComPort.SendData((BYTE*)outbuf,strlen(outbuf));
			TRACE("CRC:%s\n",outbuf);
			sprintf(outbuf,"%d\r\nOK\r\n",xCrc);
			ixx=strlen(outbuf);
			xCrc=0;
			oPos=0;
			//	..
			rCnt=0;
			tPos=0;
			Sleep(20);
			do
			{
				//pComm->ReadData((BYTE*)&stt[tPos],100,&rLen);
				pDlg->m_ComPort.ReadData((BYTE*)&stt[tPos],strlen(outbuf),&rLen);
				tPos+=rLen;
				if(tPos>=(ixx-2))	break;
				Sleep(10);
				rCnt++;
			}while(rCnt<100);
			if(rCnt==100)
			{
				AfxMessageBox("操作失败!");
				return 1;
			}
			//stt[tPos]=0;
			//if(strcmp(stt,outbuf)!=0)
			if((strstr(stt,"\rOK")==NULL)&&(strstr(stt,"\nOK")==NULL))
			{
				AfxMessageBox("操作失败!");
				return 1;
			}
			pDlg->m_ComPort.ClearBuffer();
			
			
			/*
			//	PROGRAM
			//	P X X
			//sprintf(outbuf,"P %d %d\r\n",iSect/2,iSect/2);
			sprintf(outbuf,"P %d %d\r\n",0,27);
			ixx=strlen(outbuf);
			pComm->SendData((BYTE*)outbuf,ixx);
			strcat(outbuf,"0\r\n");
			ixx+=3;
			tPos=0;
			Sleep(20);
			do
			{
				//pComm->ReadData((BYTE*)&stt[tPos],100,&rLen);
				pComm->ReadData((BYTE*)&stt[tPos],strlen(outbuf),&rLen);
			
				tPos+=rLen;
				if(tPos>=ixx)	break;

⌨️ 快捷键说明

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