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

📄 gconsole.cpp

📁 PC通过串口、USB与目标板进行通信的工具
💻 CPP
📖 第 1 页 / 共 2 页
字号:

		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 + -