📄 gconsole.cpp
字号:
if((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
if( nLength=ReadCommBlock(rxBuf,MAX_BLOCK_SIZE) )
{
rxBuf[nLength]='\0';
EB_Printf(rxBuf);
}
}
// Clear OVERRUN condition.
// If OVERRUN error is occurred,the tx/rx will be locked.
if(dwEvtMask & EV_ERR)
{
COMSTAT comStat;
DWORD dwErrorFlags;
ClearCommError(idComDev,&dwErrorFlags,&comStat);
EB_Printf(TEXT("[DBG:EV_ERR]\n"));
}
}
CloseHandle(os.hEvent);
return;
}
unsigned long GenerateCRC32(char * DataBuf,unsigned long len)
{
unsigned long oldcrc32;
unsigned long crc32;
unsigned long oldcrc;
unsigned int charcnt;
char c,t;
oldcrc32 = 0x00000000; //初值为0
charcnt=0;
while (len--)
{
t= (char)(oldcrc32 >> 24) & 0xFF; //要移出的字节的值
oldcrc=crc_32_tab[t]; //根据移出的字节的值查表
c=DataBuf[charcnt]; //新移进来的字节值
oldcrc32= (oldcrc32 << 8) | c; //将新移进来的字节值添在寄存器末字节中
oldcrc32=oldcrc32^oldcrc; //将寄存器与查出的值进行xor运算
charcnt++;
}
crc32=oldcrc32;
return crc32;
}
int GetPacket(unsigned char *buf)
{
unsigned char tmpBuff[(TX_SIZE+20)*2];
int nRecv;
unsigned char t_char;
int packetBegin = 0;
int packetEnd = 0;
int mask = 0;
int a = 0;
int length = 0;
DWORD dwEvtMask;
COMSTAT ComStat;
int i;
while( downloadCanceled!=1 )
{
WaitCommEvent(idComDev,&dwEvtMask,NULL); //wait until any event is occurred.
if( (dwEvtMask & EV_TXEMPTY) == EV_TXEMPTY )
txIsEmpty=TRUE;
if((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
nRecv=ReadCommBlock((char*)tmpBuff,(TX_SIZE+20)*2);
}
if(dwEvtMask & EV_ERR)
{
ClearCommError(idComDev, &dwEvtMask, &ComStat);
EB_Printf(TEXT("[DBG:EV_ERR]\n"));
}
for(i=0; i<nRecv; i++)
{
// read a data from serial
t_char = tmpBuff[i];
if( t_char == 0xfb && packetBegin == 0) //start of a packet
{
packetBegin = 1;
length=0;
continue;
}
else if(packetBegin == 0) //do not start a packet, just printf
{
EB_Printf("%c", t_char);
continue;
}
else if(t_char == 0xfb) //end of the packet, return
{
packetEnd = 1;
packetBegin = 0;
continue;
}
//handle char stream in the packet
if (t_char == 0x7d)
{
mask = 1;
continue;
}
if (mask)
{
t_char = t_char ^ 0x20;
buf[length ++] = t_char;
mask = 0;
continue;
}
else
buf[length ++] = t_char;
}
if(packetEnd == 1)
return length;
}
return length;
}
int CreatePPP(unsigned char * ppp, unsigned char * fcs, int FcsLength)
{
int i, j;
if (ppp == NULL || fcs == NULL)
return 0;
j = 0;
ppp[j++] = 0xfb;
for (i = 0; i < FcsLength; i++)
{
if (fcs[i] == 0xfb)
{
ppp[j++] = 0x7d;
ppp[j++] = 0xfb ^ 0x20;
}
else if (fcs[i] == 0x7d)
{
ppp[j++] = 0x7d;
ppp[j++] = 0x7d ^ 0x20;
}
else
ppp[j++] = fcs[i];
}
ppp[j++] = 0xfb;
return j;
}
void RxFile(char *FilePath, unsigned char pos, int address, int length, int block)
{
HANDLE hFile;
DWORD temp;
unsigned int nLength,nRecv;
unsigned char RcvBuff[RX_SIZE+20];
unsigned char buf[RX_SIZE+20];
unsigned char cmd_buf[7];
hFile=CreateFile(szFileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,0,NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
EB_Printf(TEXT("[ERROR:Open File Failure]\n") );
return;
}
// download dialog initial
InitDownloadProgress(length/RX_SIZE);
isTransmitting = TRUE;
// send dump address
temp = 0;
buf[temp] = pos;
temp += 1;
memcpy(buf + temp, (unsigned char *)(&address), 4);
temp += 4;
memcpy(buf + temp, (unsigned char *)(&length), 4);
temp += 4;
memcpy(buf + temp, (unsigned char *)(&block), 4);
temp += 4;
nLength = CreateDataFrame((unsigned char*)buf, temp, (unsigned char*)RcvBuff);
nRecv = CreatePPP(buf, RcvBuff, nLength);
WriteFile(idComDev, buf, nRecv, &temp, &osWrite);
// get the response from the bios
GetOverlappedResult(idComDev,&osWrite,&temp,TRUE);
nLength = GetPacket(cmd_buf);
if (cmd_buf[1] != TX_START)
{
isTransmitting=FALSE;
inputEnable = 1;
EB_Printf(TEXT("[ERROR:Receive wrong data!]\n") );
CloseHandle(hFile);
CloseDownloadProgress();
return;
}
else
{
nLength = CreateCommFrame(RECV_OK, (unsigned char*)cmd_buf);
WriteFile(idComDev,cmd_buf,nLength,&temp,&osWrite);
}
nRecv = 0;
while(1)
{
if (downloadCanceled == 1)
{
nLength = CreateCommFrame( FINISHED, (unsigned char*)cmd_buf );
WriteFile(idComDev,cmd_buf,nLength,&temp,&osWrite);
EB_Printf(TEXT("[ERROR:User Canceled]\n") );
break;
}
GetOverlappedResult(idComDev,&osWrite,&temp,TRUE);
nLength = GetPacket(RcvBuff);
if (RcvBuff[1] == FINISHED)
break;
if (FCS_Check(RcvBuff, nLength) == 1)
{
nRecv += nLength - 3;
DisplayDownloadProgress(nRecv/RX_SIZE + 1);
WriteFile(hFile, RcvBuff + 1, nLength - 3, &temp, NULL);
nLength = CreateCommFrame(RECV_OK, (unsigned char*)cmd_buf);
WriteFile(idComDev,cmd_buf,nLength,&temp,&osWrite);
}
else
{
nLength = CreateCommFrame(FCS_ERROR, (unsigned char*)cmd_buf);
WriteFile(idComDev,cmd_buf,nLength,&temp,&osWrite);
}
}
CloseHandle(hFile);
CloseDownloadProgress();
isTransmitting=FALSE;
inputEnable = 1;
return;
}
int ReadCommBlock(char *buf,int maxLen)
{
BOOL fReadStat;
COMSTAT comStat;
DWORD dwErrorFlags;
DWORD dwLength;
ClearCommError(idComDev,&dwErrorFlags,&comStat);
dwLength=min((DWORD)maxLen,comStat.cbInQue);
if(dwLength>0)
{
fReadStat=ReadFile(idComDev,buf,dwLength,&dwLength,&osRead);
if(!fReadStat)
{
EB_Printf(TEXT("[RXERR]") );
}
}
return dwLength;
}
void TxFile(void *args)
{
DWORD txPos = 0;
DWORD txBlkSize = 0;
DWORD temp;
unsigned char buf[(TX_SIZE+20)*2];
unsigned char m_buf[TX_SIZE+20];
unsigned char cmd_buf[7];
int length;
BOOL resendFlag=FALSE;
int jj;
InitDownloadProgress(0);
isTransmitting = TRUE;
length = CreateDataFrame((unsigned char*)&txBufSize, 4, (unsigned char*)m_buf);
jj = CreatePPP(buf, m_buf, length);
WriteFile(idComDev,buf,jj,&temp,&osWrite);
GetOverlappedResult(idComDev,&osWrite,&temp,TRUE);
length = GetPacket(cmd_buf);
if(downloadCanceled==1)
{
isTransmitting=FALSE;
inputEnable = 1;
free((void *)txBuf);
length = CreateCommFrame( FINISHED, (unsigned char*)cmd_buf );
WriteFile(idComDev,cmd_buf,length,&temp,&osWrite);
EB_Printf(TEXT("[ERROR:User Canceled]\n") );
return;
}
if(cmd_buf[1]!=TX_START)
{
isTransmitting=FALSE;
inputEnable = 1;
free((void *)txBuf);
EB_Printf(TEXT("[ERROR:Receive wrong data]\n") );
CloseDownloadProgress();
return;
}
while(downloadCanceled!=1&&txPos<txBufSize)
{
if (!resendFlag)
{
txBlkSize = ((txBufSize-txPos)>TX_SIZE)?TX_SIZE:(txBufSize-txPos);
length = CreateDataFrame((unsigned char*)txBuf+txPos, txBlkSize, (unsigned char*)m_buf);
jj = CreatePPP(buf, m_buf, length);
WriteFile(idComDev,buf,jj,&temp,&osWrite);
GetOverlappedResult(idComDev,&osWrite,&temp,TRUE);
}
else
{
WriteFile(idComDev,buf,jj,&temp,&osWrite);
GetOverlappedResult(idComDev,&osWrite,&temp,TRUE);
}
length = GetPacket(cmd_buf);
if(downloadCanceled==1)
{
isTransmitting=FALSE;
inputEnable = 1;
free((void *)txBuf);
length = CreateCommFrame( FINISHED, cmd_buf );
WriteFile(idComDev,cmd_buf,length,&temp,&osWrite);
EB_Printf(TEXT("[ERROR:User Canceled]\n") );
break;
}
if (cmd_buf[1] == FCS_ERROR)
{
resendFlag = TRUE;
continue;
}
if (cmd_buf[1] == FLA_ERROR)
{
EB_Printf(TEXT("[ERROR:Write flash error]\n") );
break;
}
if (cmd_buf[1] == RECV_OK)
{
txPos += txBlkSize;
resendFlag = FALSE;
}
DisplayDownloadProgress(txPos*100/txBufSize);
}
if(cmd_buf[1]==FLA_ERROR)
{
isTransmitting=FALSE;
inputEnable = 1;
free((void *)txBuf);
EB_Printf(TEXT("[ERROR:Write flash error]\n") );
CloseDownloadProgress();
return;
}
length = CreateCommFrame(FINISHED, cmd_buf);
WriteFile(idComDev,cmd_buf,length,&temp,&osWrite);
GetOverlappedResult(idComDev,&osWrite,&temp,TRUE);
free((void *)txBuf);
CloseDownloadProgress();
isTransmitting=FALSE;
inputEnable = 1;
return;
}
void WriteCommBlock(char c)
{
void *txBlk;
DWORD txBlkSize;
static char _c;
DWORD temp;
_c=c;
while(!txIsEmpty);
txBlk=&_c;
txBlkSize=1;
//txIsEmpty=FALSE; why needed??? this line should be removed.
WriteFile(idComDev,txBlk,txBlkSize,&temp,&osWrite);
while(!txIsEmpty);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -