www.pudn.com > LoadMachineCode111.rar > ComOperateNew.cpp


// ComOperateNew.cpp: implementation of the CComOperateNew class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "ComOperateNew.h" 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CComOperateNew::CComOperateNew() 
{ 
 
} 
 
CComOperateNew::~CComOperateNew() 
{ 
	//delete []Send_buff; 
	//delete []Rece_buff; 
 
} 
 
BOOL CComOperateNew::MakeItem(int TAG, char *buffer) 
{ 
	int i=0,q=0,s=0,x=0,s1,s2; 
	int len=0; 
	static   int xh=0; 
	char Temp[PACKLEN]; 
 
	Send_buff=new char[PACKLEN]; 
	memset(Send_buff,'\0',PACKLEN); 
 
	memset(Temp,'\0',PACKLEN); 
 
	Temp[0]=STX;				/*	STX	*/ 
 
	Temp[1]=(xh>>4)&0x0f;			/*	SEQ	*/ 
	if (Temp[1]>=10) 
		Temp[1]=Temp[1]-10+0x41; 
	else 
		Temp[1]=Temp[1]+0x30; 
	Temp[2]=(xh)&0x0f;	 
	if (Temp[2]>=10) 
		Temp[2]=Temp[2]-10+0x41; 
	else 
		Temp[2]=Temp[2]+0x30; 
 
	if(TAG==READ_SN) 
		xh=0; 
	else 
		xh++; 
 
	Temp[3]=(TAG>>4)&0x0f;			/*	TAG	*/ 
	if (Temp[3]>=10) 
		Temp[3]=Temp[3]-10+0x41; 
	else 
		Temp[3]=Temp[3]+0x30; 
	Temp[4]=(TAG)&0x0f;	 
	if (Temp[4]>=10) 
		Temp[4]=Temp[4]-10+0x41; 
	else 
		Temp[4]=Temp[4]+0x30; 
 
	len=strlen(buffer)/2;			/*	LEN	*/ 
	Temp[5]=(len>>12)&0x0f;	 
	if (Temp[5]>=10) 
		Temp[5]=Temp[5]-10+0x41; 
	else 
		Temp[5]=Temp[5]+0x30; 
	Temp[6]=(len>>8)&0x0f;	 
	if (Temp[6]>=10) 
		Temp[6]=Temp[6]-10+0x41; 
	else 
		Temp[6]=Temp[6]+0x30; 
	Temp[7]=(len>>4)&0x0f;	 
	if (Temp[7]>=10) 
		Temp[7]=Temp[7]-10+0x41; 
	else 
		Temp[7]=Temp[7]+0x30; 
	Temp[8]=(len)&0x0f;	 
	if (Temp[8]>=10) 
		Temp[8]=Temp[8]-10+0x41; 
	else 
		Temp[8]=Temp[8]+0x30; 
	 
	strcat(Temp,buffer);			/*	DATA	*/ 
	 
	for (i=0;i<4+len;i++)			/*	LRC	*/	 
	{ 
		if ((Temp[i*2+1]>='A')&&(Temp[i*2+1]<='F')) 
			s1=(Temp[i*2+1]-'A'+10); 
		else if((Temp[i*2+1]>='0')&&(Temp[i*2+1]<='9')) 
			s1=(Temp[i*2+1]-'0'); 
		if ((Temp[i*2+2]>='A')&&(Temp[i*2+2]<='F')) 
			s2=(Temp[i*2+2]-'A'+10); 
		else if((Temp[i*2+2]>='0')&&(Temp[i*2+2]<='9')) 
			s2=(Temp[i*2+2]-'0'); 
 
		x=(s1<<4)|(s2); 
		q=(q+x)%65536; 
		s=(s+q)%65536; 
	} 
	Temp[8+len*2+1]=(s>>12)&0x0f;	 
	if (Temp[8+len*2+1]>=10) 
		Temp[8+len*2+1]=Temp[8+len*2+1]-10+0x41; 
	else 
		Temp[8+len*2+1]=Temp[8+len*2+1]+0x30; 
 
	Temp[8+len*2+2]=(s>>8)&0x0f;	 
	if (Temp[8+len*2+2]>=10) 
		Temp[8+len*2+2]=Temp[8+len*2+2]-10+0x41; 
	else 
		Temp[8+len*2+2]=Temp[8+len*2+2]+0x30; 
 
	Temp[8+len*2+3]=(s>>4)&0x0f;	 
	if (Temp[8+len*2+3]>=10) 
		Temp[8+len*2+3]=Temp[8+len*2+3]-10+0x41; 
	else 
		Temp[8+len*2+3]=Temp[8+len*2+3]+0x30; 
 
	Temp[8+len*2+4]=(s)&0x0f;	 
	if (Temp[8+len*2+4]>=10) 
		Temp[8+len*2+4]=Temp[8+len*2+4]-10+0x41; 
	else 
		Temp[8+len*2+4]=Temp[8+len*2+4]+0x30; 
 
	Temp[8+len*2+5]=ETX;			/*	ETC	*/ 
 
	strcpy(Send_buff,Temp); 
	return TRUE; 
 
} 
 
BOOL CComOperateNew::CheckRece(int TAG, char *Temp) 
{ 
	int i,len=0,q=0,s=0,x=0,s1=0,s2=0; 
	int LRC; 
 
	if ((Temp[0]!=STX)||(Temp[strlen(Temp)-1]!=ETX)) 
		return FALSE; 
 
	/*	验证TAG		*/ 
	if ((Temp[3]>='A')&&(Temp[3]<='F')) 
		s1=(Temp[3]-'A'+10); 
	else if((Temp[3]>='0')&&(Temp[3]<='9')) 
		s1=(Temp[3]-'0'); 
	if ((Temp[4]>='A')&&(Temp[4]<='F')) 
		s2=(Temp[4]-'A'+10); 
	else if((Temp[4]>='0')&&(Temp[4]<='9')) 
		s2=(Temp[4]-'0'); 
 
	x=(s1<<4)|(s2); 
 
	if(TAG!=x)	return FALSE;	 
 
	 
	if ((Temp[5]>='A')&&(Temp[5]<='F'))	/*	LEN	*/ 
		len=(Temp[5]-'A'+10)*4096; 
	else if((Temp[5]>='0')&&(Temp[5]<='9')) 
		len=(Temp[5]-'0')*4096; 
 
	if ((Temp[6]>='A')&&(Temp[6]<='F')) 
		len=len+(Temp[6]-'A'+10)*256; 
	else if((Temp[6]>='0')&&(Temp[6]<='9')) 
		len=len+(Temp[6]-'0')*256; 
 
	if ((Temp[7]>='A')&&(Temp[7]<='F')) 
		len=len+(Temp[7]-'A'+10)*16; 
	else if((Temp[7]>='0')&&(Temp[7]<='9')) 
		len=len+(Temp[7]-'0')*16; 
 
	if ((Temp[8]>='A')&&(Temp[8]<='F')) 
		len=len+(Temp[8]-'A'+10); 
	else if((Temp[8]>='0')&&(Temp[8]<='9')) 
		len=len+(Temp[8]-'0'); 
 
 
	for (i=0;i<4+len;i++)			/*	LRC	*/	 
	{ 
		if ((Temp[i*2+1]>='A')&&(Temp[i*2+1]<='F')) 
			s1=(Temp[i*2+1]-'A'+10); 
		else if((Temp[i*2+1]>='0')&&(Temp[i*2+1]<='9')) 
			s1=(Temp[i*2+1]-'0'); 
		if ((Temp[i*2+2]>='A')&&(Temp[i*2+2]<='F')) 
			s2=(Temp[i*2+2]-'A'+10); 
		else if((Temp[i*2+2]>='0')&&(Temp[i*2+2]<='9')) 
			s2=(Temp[i*2+2]-'0'); 
 
		x=(s1<<4)|(s2); 
		q=(q+x) % 65536; 
		s=(s+q) % 65536; 
	} 
	/*	接收到的LRC	*/	 
	if ((Temp[strlen(Temp)-5]>='A')&&(Temp[strlen(Temp)-5]<='F')) 
		LRC=(Temp[strlen(Temp)-5]-'A'+10)*4096; 
	else if((Temp[strlen(Temp)-5]>='0')&&(Temp[strlen(Temp)-5]<='9')) 
		LRC=(Temp[strlen(Temp)-5]-'0')*4096; 
	if ((Temp[strlen(Temp)-4]>='A')&&(Temp[strlen(Temp)-4]<='F')) 
		LRC=LRC+(Temp[strlen(Temp)-4]-'A'+10)*256; 
	else if((Temp[strlen(Temp)-4]>='0')&&(Temp[strlen(Temp)-4]<='9')) 
		LRC=LRC+(Temp[strlen(Temp)-4]-'0')*256; 
	if ((Temp[strlen(Temp)-3]>='A')&&(Temp[strlen(Temp)-3]<='F')) 
		LRC=LRC+(Temp[strlen(Temp)-3]-'A'+10)*16; 
	else if((Temp[strlen(Temp)-3]>='0')&&(Temp[strlen(Temp)-3]<='9')) 
		LRC=LRC+(Temp[strlen(Temp)-3]-'0')*16; 
	if ((Temp[strlen(Temp)-2]>='A')&&(Temp[strlen(Temp)-2]<='F')) 
		LRC=LRC+(Temp[strlen(Temp)-2]-'A'+10); 
	else if((Temp[strlen(Temp)-2]>='0')&&(Temp[strlen(Temp)-2]<='9')) 
		LRC=LRC+(Temp[strlen(Temp)-2]-'0'); 
 
 
	if(LRC!=s)	return FALSE;	 
 
	return TRUE; 
 
} 
BOOL CComOperateNew::Rececodestrm(char TAG, char *buffer) 
{ 
	char temp; 
	BOOL result=FALSE; 
	int resend=0,i=0,status=0; 
	BOOL SUCCESS; 
	int count; 
	int j; 
 
	while(1) 
	{ 
		switch(status) 
		{ 
			case 0:		/*		STX		*/ 
				/*	接收回应包时间加长	*/ 
				for (j=0;j<20;j++) 
				{ 
					for(count=0;count<65535;count++) 
						{ 
							result=In_Port(&temp); 
							if (result==TRUE)  
							{ 
								 
								j=20; 
								break; 
							} 
						} 
				} 
				if (result==TRUE) 
				{ 
					if (temp==STX)	 
						{ 
							buffer[i++]=temp; 
							status=1; 
 
						} 
				} 
				else 
					status=99; 
				break; 
			case 1:		/*		帧其余部分	*/ 
				for (j=0;j<5;j++) 
				{ 
					for(count=0;count<65535;count++) 
						{ 
							result=In_Port(&temp); 
							if (result==TRUE)  
							{ 
								j=5; 
								break; 
							} 
						} 
				} 
 
				if (result==TRUE) 
				{ 
					buffer[i++]=temp; 
 
					if (temp==ETX)	 
						{ 
							status=2; 
						} 
				} 
				else 
					status=99; 
				break; 
			case 2:		/*		校验		*/ 
				result=CheckRece(TAG,buffer); 
				if (result==TRUE) 
				{ 
					SUCCESS=TRUE; 
					status=100; 
				} 
				else 
					status=99; 
				break; 
			case 99:	/*		重发		*/ 
				if (++resend<3) 
				{ 
					Out_Port(Send_buff); 
					status=0; 
				} 
				else 
				{ 
					SUCCESS=FALSE; 
					status=100; 
				} 
				break; 
			case 100: 
				return (SUCCESS); 
		}/*	switch	*/ 
	}/*	while	*/ 
 
} 
 
BOOL CComOperateNew::OpenRemoteportm(int com) 
{ 
	BOOL result; 
 
	result=Port_Init(com); 
	if (result==FALSE) 
	{ 
	    Port_Res();	 
		return (FALSE); 
	} 
	return TRUE; 
 
} 
 
BOOL CComOperateNew::PortRW(int TAG, char *buffer,int com) 
{ 
	char temp[PACKLEN]; 
    int i=0,s1=0,s2=0,x=0; 
	BOOL result=FALSE; 
 
	/*	打开端口	*/ 
	result=OpenRemoteportm(com); 
 
    /*	打包		*/ 
	MakeItem(TAG,buffer); 
 
	/*	发送字符串	*/ 
	Out_Port(Send_buff); 
 
	memset(temp,'\0',PACKLEN);  
 
	/*	接收字符串	*/ 
	result=Rececodestrm(TAG,temp); 
	if (result==FALSE) 
	{	 
		Port_Res(); 
		return FALSE;		 
	} 
 
	Port_Res(); 
	delete []Send_buff; 
	Send_buff=NULL; 
	return TRUE; 
 
} 
 
BOOL CComOperateNew::PortRW(int TAG, char *buffer, char *rece_buff, int com) 
{ 
	char temp[PACKLEN]; 
	int result=0,i=0,s1=0,s2=0,x=0; 
 
	/*	打开端口	*/ 
	result=OpenRemoteportm(com); 
	if (result==FALSE) 
		return FALSE; 
 
	/*	打包		*/ 
	MakeItem(TAG,buffer); 
 
	/*	发送字符串	*/ 
	Out_Port(Send_buff); 
 
	memset(temp,'\0',PACKLEN);  
	memset(rece_buff,'\0',PACKLEN); 
 
	/*	接收字符串	*/ 
	result=Rececodestrm(TAG,temp); 
	if (result==TRUE) 
	{ 
		switch(TAG) 
		{ 
			case READ_SN: 
					i=18;	break; 
			case GEN_KEYPAIR: 
					i=192;	break; 
			case ADD_SIG: 
					i=16;	break; 
			case LOAD_AK: 
			case DEL_ACCU: 
			case UNLOCK: 
			case DIST_MACH: 
			case INIT_IC: 
			case VER_ICMM: 
			case CHG_ICMM: 
			case COMP_CHIPNO: 
					i=0;	break; 
			case CONN_CALU: 
					i=20;	break; 
			case ICZFMM: 
					i=500;	break; 
			default:	 
					break; 
		} 
 
		result=i; 
 
		for (i=0;i='A')&&(temp[9]<='F')) 
		s1=(temp[9]-'A'+10); 
	else if((temp[9]>='0')&&(temp[9]<='9')) 
		s1=(temp[9]-'0'); 
	if ((temp[10]>='A')&&(temp[10]<='F')) 
		s2=(temp[10]-'A'+10); 
	else if((temp[10]>='0')&&(temp[10]<='9')) 
		s2=(temp[10]-'0'); 
 
	x=s1*10+s2; 
	/*	关闭端口	*/ 
	Port_Res(); 
	if(x!=0) 
		return FALSE; 
	else 
		return TRUE; 
 
}