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;
}