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

📄 lpc21xxisp.cpp

📁 请先把由ADS生成的HEX文件通过HEX2BIN专程BIN文件
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////////////////
//	WWW.DRAGON-2008.COM	版权所有
//	您可以将该程序用在任何您需要的地方,但请您保留此信息
//	欢迎提供修改意见
//	VC6.0程序
//	请先把由ADS生成的HEX文件通过HEX2BIN专程BIN文件
//	串口操作需要CSerialPort类支持

void ProgramFlash() 
{
	CComPort	xComPort;
	char		str1[50]="Synchronized\r\n";
	char		stt[100];
	if(xComPort.Open("COM1")!=ERROR_SUCCESS)
	{
		MessageBox("打开串口失败!");
		return ;
	}
	xComPort.Setup(CComPort::EBaud9600,CComPort::EData8,CComPort::EParNone,CComPort::EStop1);
	xComPort.SetupHandshaking(CComPort::EHandshakeOff);
	int		linelen;
	int		linecnt;
	char	outbuf[100];
	int		iSect=0;
	DWORD	xLen,rLen;
	CFile	file;
	if(file.Open("G:\\Burn.bin",CFile::modeRead,NULL)==NULL)
	{
		MessageBox("BIN文件打开失败!");
		return ;
	}
 	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();
		MessageBox("分配内存失败!");
		return ;
	}
	if(file.Read(sBuf,xLen)!=xLen)
	{
		file.Close();
		MessageBox("读文件失败!");
		return ;
	}
	file.Close();
	
	DWORD	tPos=0;
	DWORD	rCnt=0;
	DWORD	iPos=0;
	DWORD	xCrc=0;
	int		oPos=0;
	DWORD	ixx;
	//////////////////////////////////
	do
	{
		stt[0]=0x3F;
		xComPort.Write(stt,1);
		Sleep(10);
		xComPort.Read(stt,100,&tPos);
		rCnt++;
	}while((tPos==0||tPos==1&&stt[0]==0x3F)&&rCnt<100);
	if(rCnt==100)
	{
		MessageBox("操作失败!");
		return ;
	}
 	tPos=tPos;
	rCnt=0;
	do
	{
		xComPort.Read(&stt[tPos],100-tPos,&iPos);
		tPos+=iPos;
		if(tPos>=14)	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		MessageBox("操作失败!");
		return ;
	}
	stt[tPos]=0;
	if(strcmp(stt,str1)!=0)
		return ;
	//////////////////////////////////
	//	Synchronized
	xComPort.Write(str1,strlen(str1));
	tPos=0;
	rCnt=0;
	do
	{
		xComPort.Read(&stt[tPos],100,&iPos);
		tPos+=iPos;
		if(tPos>=18)	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		MessageBox("操作失败!");
		return ;
	}
	stt[tPos]=0;
	if(strcmp(stt,"Synchronized\r\nOK\r\n")!=0)
		return ;
	//////////////////////////////////
	//	12000
	rCnt=0;
	tPos=0;
	strcpy(str1,"12000\r\n");
	xComPort.Write(str1,strlen(str1));
	do
	{
		xComPort.Read(&stt[tPos],100,&iPos);
		tPos+=iPos;
		if(tPos>=11)	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		MessageBox("操作失败!");
		return ;
	}
	stt[tPos]=0;
	if(strcmp(stt,"12000\r\nOK\r\n")!=0)
		return ;
	//////////////////////////////////
	//	U 23130
	rCnt=0;
	tPos=0;
	strcpy(str1,"U 23130\r\n");
	xComPort.Write(str1,strlen(str1));
	do
	{
		xComPort.Read(&stt[tPos],100,&iPos);
		tPos+=iPos;
		if(tPos>=12)	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		MessageBox("操作失败!");
		return ;
	}
	stt[tPos]=0;
	if(strcmp(stt,"U 23130\r\n0\r\n")!=0)
		return ;
	//////////////////////////////////
	//	J
	rCnt=0;
	tPos=0;
	strcpy(str1,"J\r\n");
	xComPort.Write(str1,strlen(str1));
	do
	{
		xComPort.Read(&stt[tPos],100,&iPos);
		tPos+=iPos;
		Sleep(10);
		rCnt++;
	}while(rCnt<10);
	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 ;
	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 ;
		}
	}
	m_HardID=dwHardID;
	UpdateData(FALSE);
	///////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////
	//	烧写FLASH

	//	P 0 1
	tPos=0;
	sprintf(outbuf,"P 0 %d\r\n",(xLen-1)/8192);
	ixx=strlen(outbuf);
	xComPort.Write(outbuf,ixx);
	strcat(outbuf,"0\r\n");
	ixx+=3;
	do
	{
		xComPort.Read(&stt[tPos],100,&rLen);
		tPos+=rLen;
		if(tPos>=ixx)	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		MessageBox("操作失败!");
		return ;
	}
	stt[tPos]=0;
	if(strcmp(stt,outbuf)!=0)
	{
		MessageBox("操作失败!");
		return ;
	}

	//	E 0 1
	tPos=0;
	sprintf(outbuf,"E 0 %d\r\n",(xLen-1)/8192);
	ixx=strlen(outbuf);
	xComPort.Write(outbuf,ixx);
	strcat(outbuf,"0\r\n");
	ixx+=3;
	do
	{
		xComPort.Read(&stt[tPos],100,&rLen);
		tPos+=rLen;
		if(tPos>=ixx)	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		MessageBox("操作失败!");
		return ;
	}
	stt[tPos]=0;
	if(strcmp(stt,outbuf)!=0)
	{
		MessageBox("操作失败!");
		return ;
	}
	
	//	W 40000200H 4096
	//	"W 1073742336 4096\r\n"
	tPos=0;
	strcpy(outbuf,"W 1073742336 4096\r\n");
	ixx=strlen(outbuf);
	xComPort.Write(outbuf,ixx);
	strcat(outbuf,"0\r\n");
	ixx+=3;
	do
	{
		xComPort.Read(&stt[tPos],100,&rLen);
		tPos+=rLen;
		if(tPos>=ixx)	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		MessageBox("操作失败!");
		return ;
	}
	stt[tPos]=0;
	if(strcmp(stt,outbuf)!=0)
	{
		MessageBox("操作失败!");
		return ;
	}
	iPos=0;
	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);
			xComPort.Write(outbuf,ixx);
			Sleep(50);
			do
			{
				xComPort.Read(&stt[tPos],100,&rLen);
				tPos+=rLen;
				if(tPos>=ixx)	break;
				Sleep(10);
				rCnt++;
			}while(rCnt<100);
			if(rCnt==100)
			{
				MessageBox("操作失败!");
				return ;
			}
			stt[tPos]=0;
			if(strcmp(stt,outbuf)!=0)
			{
				MessageBox("操作失败!");
				return ;
			}
			//	+++++++++++++++++++++++++++++++++++
			//	CRC + OK
			sprintf(outbuf,"%d\r\n",xCrc);
			xComPort.Write(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(50);
			do
			{
				xComPort.Read(&stt[tPos],100,&rLen);
				tPos+=rLen;
				if(tPos>=ixx)	break;
				Sleep(10);
				rCnt++;
			}while(rCnt<100);
			if(rCnt==100)
			{
				MessageBox("操作失败!");
				return ;
			}
			stt[tPos]=0;
			if(strcmp(stt,outbuf)!=0)
			{
				MessageBox("操作失败!");
				return ;
			}

			//	PROGRAM
			//	P X X
			sprintf(outbuf,"P %d %d\r\n",iSect/2,iSect/2);
			ixx=strlen(outbuf);
			xComPort.Write(outbuf,ixx);
			strcat(outbuf,"0\r\n");
			ixx+=3;
			tPos=0;
			Sleep(50);
			do
			{
				xComPort.Read(&stt[tPos],100,&rLen);
				tPos+=rLen;
				if(tPos>=ixx)	break;
				Sleep(10);
				rCnt++;
			}while(rCnt<100);
			if(rCnt==100)
			{
				MessageBox("操作失败!");
				return ;
			}
			stt[tPos]=0;
			if(strcmp(stt,outbuf)!=0)
			{
				MessageBox("操作失败!");
				return ;
			}
			//	C Y 1073742336 4096
			sprintf(outbuf,"C %d 1073742336 4096\r\n",iSect*4096);
			ixx=strlen(outbuf);
			xComPort.Write(outbuf,ixx);
			strcat(outbuf,"0\r\n");
			ixx+=3;
			Sleep(50);
			tPos=0;
			do
			{
				xComPort.Read(&stt[tPos],100,&rLen);
				tPos+=rLen;
				if(tPos>=ixx)	break;
				Sleep(10);
				rCnt++;
			}while(rCnt<100);
			if(rCnt==100)
			{
				MessageBox("操作失败!");
				return ;
			}
			stt[tPos]=0;
			if(strcmp(stt,outbuf)!=0)
			{
				MessageBox("操作失败!");
				return ;
			}

			iSect++;

			if(xLen-iPos>4096)
			{
				//	W 40000200H 4096
				//	"W 1073742336 4096\r\n"
				strcpy(outbuf,"W 1073742336 4096\r\n");
				ixx=strlen(outbuf);
				xComPort.Write(outbuf,ixx);
				strcat(outbuf,"0\r\n");
				ixx+=3;
				Sleep(50);
				tPos=0;
				do
				{
					xComPort.Read(&stt[tPos],100,&rLen);
					tPos+=rLen;
					if(tPos>=ixx)	break;
					Sleep(10);
					rCnt++;
				}while(rCnt<100);
				if(rCnt==100)
				{
					MessageBox("操作失败!");
					return ;
				}
				stt[tPos]=0;
				if(strcmp(stt,outbuf)!=0)
				{
					MessageBox("操作失败!");
					return ;
				}
			}
			else
			{
				//	W 40000200H 4096
				//	"W 1073742336 4096\r\n"
				sprintf(outbuf,"W 1073742336 %d\r\n",xLen-iPos);
				ixx=strlen(outbuf);
				xComPort.Write(outbuf,ixx);
				strcat(outbuf,"0\r\n");
				ixx+=3;
				Sleep(10);
				tPos=0;
				do
				{
					xComPort.Read(&stt[tPos],100,&rLen);
					tPos+=rLen;
					if(tPos>=ixx)	break;
					Sleep(10);
					rCnt++;
				}while(rCnt<100);
				if(rCnt==100)
				{
					MessageBox("操作失败!");
					return ;
				}
				stt[tPos]=0;
				if(strcmp(stt,outbuf)!=0)
				{
					MessageBox("操作失败!");
					return ;
				}
			}
		}
		else
		{
			if(iPos>12370)
			{
				iPos++;
				iPos--;
			}

			outbuf[oPos++]=ENCODE_BYTE(linelen);
//			file2.Write(outbuf,1);
			for (linecnt=linelen;linecnt>0;)
			{
				outbuf [oPos++] = ENCODE_BYTE ((sBuf[iPos] & 0xFC) >> 2);
				outbuf [oPos++] = ENCODE_BYTE (((sBuf[iPos] & 0x03) << 4) +
										((sBuf[iPos+1] & 0xF0) >> 4));
				outbuf [oPos++] = ENCODE_BYTE (((sBuf[iPos+1] & 0x0F) << 2) +
										((sBuf[iPos+2] & 0xC0) >> 6));
				outbuf [oPos++] = ENCODE_BYTE (sBuf[iPos+2] & 0x3F);
				xCrc+=sBuf[iPos]+sBuf[iPos+1]+sBuf[iPos+2];
//				outbuf [4] = '\0';
				iPos+=3;
				linecnt-=3;
//				file2.Write(outbuf,4);
			}
			//	+++++++++++++++++++++++++++++++++++
			//	DATA
			outbuf[oPos++]='\r';
			outbuf[oPos++]='\n';
			outbuf[oPos++]=0;
			rCnt=0;
			tPos=0;
			ixx=strlen(outbuf);
			xComPort.Write(outbuf,ixx);
			TRACE("WRITE:%s\n",outbuf);
			Sleep(50);
			do
			{
				xComPort.Read(&stt[tPos],100,&rLen);
				tPos+=rLen;
				if(tPos>=ixx)	break;
				Sleep(10);
				rCnt++;
			}while(rCnt<100);
			TRACE("rCnt:%d iPos:%d\n",rCnt,iPos);
			if(rCnt==100)
			{
				MessageBox("操作失败!");
				return ;
			}
			stt[tPos]=0;
			if(strcmp(stt,outbuf)!=0)
			{
				MessageBox("操作失败!");
				return ;
			}

			oPos=0;

			if(((iPos%4096)%900)==0)
			{
				//	+++++++++++++++++++++++++++++++++++
				//	CRC + OK
				sprintf(outbuf,"%d\r\n",xCrc);
				xComPort.Write(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(10);
				do
				{
					xComPort.Read(&stt[tPos],100,&rLen);
					tPos+=rLen;
					if(tPos>=ixx)	break;
					Sleep(10);
					rCnt++;
				}while(rCnt<100);
				if(rCnt==100)
				{
					MessageBox("操作失败!");
					return ;
				}
				stt[tPos]=0;
				if(strcmp(stt,outbuf)!=0)
				{
					MessageBox("操作失败!");
					return ;
				}
				//	接收"OK\r\n"
			}
		}
//		outbuf [oPos++]='\r';
//		outbuf [oPos++]='\n';
//		outbuf [oPos++]=0;
//		file2.Write(outbuf,strlen(outbuf));
//		oPos=0;
	}
	//	+++++++++++++++++++++++++++++++++++
	//	CRC + OK
	sprintf(outbuf,"%d\r\n",xCrc);
	TRACE("CRC:%s\n",outbuf);
	xComPort.Write(outbuf,strlen(outbuf));
	sprintf(outbuf,"%d\r\nOK\r\n",xCrc);
	ixx=strlen(outbuf);
	xCrc=0;
	oPos=0;
	//	..
	rCnt=0;
	tPos=0;
	Sleep(10);
	do
	{
		xComPort.Read(&stt[tPos],100,&rLen);
		tPos+=rLen;
		if(tPos>=ixx)	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		MessageBox("操作失败!");
		return ;
	}
	stt[tPos]=0;
	if(strcmp(stt,outbuf)!=0)
	{
		MessageBox("操作失败!");
		return ;
	}

	//	PROGRAM
	//	P X X
	sprintf(outbuf,"P %d %d\r\n",iSect/2,iSect/2);
	ixx=strlen(outbuf);
	xComPort.Write(outbuf,ixx);
	strcat(outbuf,"0\r\n");
	ixx+=3;
	Sleep(10);
	tPos=0;
	do
	{
		xComPort.Read(&stt[tPos],100,&rLen);
		tPos+=rLen;
		if(tPos>=ixx)	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		MessageBox("操作失败!");
		return ;
	}
	stt[tPos]=0;
	if(strcmp(stt,outbuf)!=0)
	{
		MessageBox("操作失败!");
		return ;
	}
	//	C Y 1073742336 Z
	sprintf(outbuf,"C %d 1073742336 4096\r\n",iSect*4096);
	ixx=strlen(outbuf);
	xComPort.Write(outbuf,ixx);
	strcat(outbuf,"0\r\n");
	ixx+=3;
	Sleep(50);
	tPos=0;
	do
	{
		xComPort.Read(&stt[tPos],100,&rLen);
		tPos+=rLen;
		if(tPos>=ixx)	break;
		Sleep(10);
		rCnt++;
	}while(rCnt<100);
	if(rCnt==100)
	{
		MessageBox("操作失败!");
		return ;
	}
	stt[tPos]=0;
	if(strcmp(stt,outbuf)!=0)
	{
		MessageBox("操作失败!");
		return ;
	}
	
	MessageBox("烧写完毕!");
}

⌨️ 快捷键说明

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