📄 lpc21xxisp.cpp
字号:
#include "stdafx.h"
#include "SCOMM.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;
char str1[50]="Synchronized\r\n";
char stt[100];
if(pComm->IsRunning())
;
else
{
AfxMessageBox("串口错误!");
return 1;
}
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文件打开失败!");
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();
unsigned int pArray[8];
unsigned int iSum = 0;
for(int y=0;y<8;y++)
{
pArray[y] = sBuf[y*4+0]+(sBuf[y*4+1]<<8)+(sBuf[y*4+2]<<16)+(sBuf[y*4+3]<<24);
if(y!=5)
iSum += pArray[y];
}
pArray[5] = 0-iSum;
//pArray[5] = iSum^0xffffffff+1;
sBuf[0x14] = (pArray[5]&0xff);
sBuf[0x15] = (pArray[5]&0xff00)>>8;
sBuf[0x16] = (pArray[5]&0xff0000)>>16;
sBuf[0x17] = (pArray[5]&0xff000000)>>24;
DWORD tPos=0;
DWORD rCnt=0;
DWORD iPos=0;
DWORD xCrc=0;
int oPos=0;
DWORD ixx;
//////////////////////////////////
//使进入ISP状态
pComm->SetBaudRate(19200);
pComm->ClearBuffer();
Sleep(20);
pComm->SendData((BYTE*)("\x55\xAA\x00\x00\x00\x00\xC0\x05\x68\x7f\x49\x5B"),12);
Sleep(1000);
pComm->SetBaudRate(19200);
pComm->ClearBuffer();
Sleep(20);
//自动波特率
do
{
stt[0]=0x3F;
pComm->SendData((BYTE*)stt,1);
Sleep(20);
//pComm->ReadData((BYTE*)stt,100,&tPos);
pComm->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");
pComm->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");
pComm->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");
pComm->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");
pComm->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");
pComm->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");
pComm->SendData((BYTE*)str1,strlen(str1));
Sleep(20);
pComm->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
pComm->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);
pComm->SendData((BYTE*)outbuf,ixx);
Sleep(20);
strcat(outbuf,"0\r\n");
ixx+=3;
do
{
//pComm->ReadData((BYTE*)&stt[tPos],100,&rLen);
pComm->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;
}
pComm->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);
pComm->SendData((BYTE*)outbuf,ixx);
Sleep(500);
strcat(outbuf,"0\r\n");
ixx+=3;
do
{
//pComm->ReadData((BYTE*)&stt[tPos],100,&rLen);
pComm->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;
}
pComm->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
{
pComm->SendData((BYTE*)str1,strlen(str1));
Sleep(30);
pComm->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;
}
pComm->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);
pComm->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);
pComm->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;
}
pComm->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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -