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


// ComOperate.cpp: implementation of the CComOperate class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "LoadMachineCode.h" 
#include "ComOperate.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CComOperate::CComOperate() 
{ 
	 
} 
 
CComOperate::~CComOperate() 
{ 
	//delete []Sendbuff; 
	//delete []Recebuff; 
 
} 
 
BOOL CComOperate::Port_Init(int com) 
{ 
	m_comDev.m_bComId = com; 
 
	if (!m_comDev.OpenConnection()) 
		return FALSE; 
	else  
		return TRUE; 
 
} 
 
BOOL CComOperate::Port_Res() 
{ 
	return m_comDev.CloseConnection(); 
 
} 
 
BOOL CComOperate::Out_Port(char *H) 
{ 
	int i,temp_len=0; 
	char buf[2]; 
	int result; 
 
	temp_len=strlen(H); 
 
  	for(i=0;i=1000) 
	{ 
		return FALSE; 
	} 
 
	return TRUE; 
 
} 
 
BOOL CComOperate::Open_remoteportm(int com) 
{ 
	char temp=0; 
	BOOL result=FALSE; 
 
	result=Port_Init(com); 
	if (result==FALSE) 
	{ 
		Port_Res(); 
		return (result); 
	} 
	result=Make_Roadm(); 
 
	if (result==FALSE) 
	{ 
		Port_Res(); 
		return result; 
	} 
	return TRUE; 
 
} 
 
BOOL CComOperate::Make_Itemm(int Mode, char *buffer) 
{ 
	int i=0; 
    char Temp[2055],s[3]; 
    int j=0; 
	int x=0; 
	static unsigned  char xh=1; 
     
	Sendbuff=new char[PACKLEN]; 
	memset(Sendbuff,'\0',PACKLEN); 
	memset(Temp,'\0',2056); 
	Temp[0]=SOH;			/*	Start char	*/ 
	Temp[1]=xh++; 
	if ((int)xh==0)		xh=1; 
    if ((int)xh==127)   xh=1; 
 
	Temp[2]=(char)Mode;	/*	Command code	*/ 
	                    /*  Temp[3],Temp[4] 表示数据长度   */ 
	if(strlen(buffer)==0) 
	{ 
		Temp[3]=(char)0xff; 
		Temp[4]=(char)0xff; 
		Temp[5]='\0'; 
		j=Temp[0]+Temp[1]+Temp[2]+0x0f+0xf0+0x0f+0xf0; 
	} 
	else 
	{ 
		Temp[3]=(char)0x08; 
		Temp[4]=(char)0xff; 
		Temp[5]='\0'; 
                 
		strcat(Temp,buffer); 
        j=0; 
		j=Temp[0]+Temp[1]+Temp[2]+Temp[3]+0x0f+0xf0; 
        for(i=5;i<2054;i++) 
		j+=Temp[i]; 
 
	} 
 
	if (j==0)  j=0xff; 
 
	s[0]=(j>>8)&0xff; 
	if((int)s[0]==0) s[0]=(char)0xff; 
	s[1]=j&0xff; 
	if((int)s[1]==0) s[1]=(char)0xff; 
	s[2]='\0'; 
	strcat(Temp,s); 
 
	strcpy(Sendbuff,Temp); 
 
	return TRUE; 
 
} 
 
BOOL CComOperate::Check_Recem(char *buffer, int *Mode) 
{ 
	int i,len; 
	char Temp; 
	char ss[3]; 
 
	*Mode=-1; 
	if (buffer[0]!=SOH) 
		return FALSE; 
    len=strlen(buffer)-2; 
 
	for(i=0,Temp=0;i>8)&0xff; 
        if((int)ss[1]==0) ss[1]=(char)0xff; 
 
    if((ss[1]==buffer[strlen(buffer)-2])||(ss[0]==buffer[strlen(buffer)-1])) 
	   { 
              *Mode=buffer[2]; 
	           return TRUE; 
        } 
		return FALSE; 
 
} 
 
BOOL CComOperate::Rece_codestrm(int Rece_len, int s_time, char *t) 
{ 
	char temp,buffer[2048]; 
	int result=0,mode=-1; 
	int temp_len=0; 
	static int re_send=0,re_rece=0; 
	int exit_mode=99; 
	int statu=0,Send_set=(FALSE); 
    int j,count; 
 
	while(1) 
	{ 
		switch(statu) 
		{ 
		case 0: 
			/*	接收回应包时间加长	*/ 
				for (j=0;j<1000;j++) 
				{ 
					for(count=0;count<65535;count++) 
						{ 
							result=In_Port(&temp); 
							if (result==TRUE)  
							{ 
								j=1000; 
								break; 
							} 
						} 
				} 
			    if (result==TRUE) 
				{ 
					if (temp==SOH) 
					{ 
					    memset(buffer,'\0',255); 
					    buffer[0]=SOH; 
					    statu=1; 
					    temp_len=1; 
					} 
				    else 
					    statu=99; 
				} 
			    else 
				{ 
					statu=99; 
				} 
				break; 
		case 1: 
			result=In_Port(&temp);                   
            if (result==TRUE) 
            { 
                buffer[temp_len]=temp; 
                if(++temp_len==7) 
                   statu=2; 
            } 
            else 
			{ 
                statu=99; 
			} 
            break; 
		case 2:	    /*success exit */ 
			mode=-1; 
			result=Check_Recem(buffer,&mode); 
 
			 
			if (result==TRUE) 
			{ 
				Send_set=FALSE; 
				if(mode==ERR) 
				{ 
					Send_set=TRUE; 
				} 
				else	 
				{ 
					exit_mode=TRUE; 
				} 
			} 
			else 
			{ 
				Send_set=TRUE; 
				statu=0; 
			} 
			break; 
 
		case 99: 
			if (++re_rece>2) 
			{ 
				exit_mode=FALSE; 
			} 
			else 
			{ 
				temp_len=0; 
				statu=0; 
			} 
			break; 
		} 
 
		if (Send_set==TRUE)   /*re_send*/ 
		{ 
			statu=0; 
			if (++re_send>2) 
			{ 
				exit_mode=FALSE; 
			} 
			else	 
			{ 
				Out_Port(Sendbuff); 
				memset(buffer,'\0',255); 
 
     			Send_set=FALSE; 
			} 
		} 
		if (exit_mode==FALSE)   /*Fail exit*/ 
		{ 
			statu=0; 
			memset(buffer,'\0',255); 
			return FALSE; 
		} 
		if (exit_mode==TRUE) 
		{ 
        	strcpy(t,buffer); 
			statu=0; 
	        memset(buffer,'\0',255); 
			return (TRUE); 
		} 
	} 
 
} 
 
BOOL CComOperate::PORT_RW(int command_set, char *buffer) 
{ 
	char temp[255]; 
	int result=0,mode=0,i=0; 
 
	Make_Itemm(command_set,buffer); 
 
	Out_Port(Sendbuff); 
	memset(temp,'\0',255); 
 
	result=Rece_codestrm(0,0,temp); 
	if (result==TRUE) 
		return TRUE; 
	else	 
	{ 
		return FALSE; 
	} 
 
	delete []Sendbuff; 
} 
 
BOOL CComOperate::download_program(int com,	LPVOID pParam) 
{ 
	CFile cf; 
	int i; 
	BOOL result=TRUE; 
	if(!cf.Open("LOAD.BIN",CFile::modeRead)) 
	{ 
		AfxMessageBox("打开文件不成功"); 
		return FALSE; 
	} 
	int nFilelength=cf.GetLength (); 
 
	result=Open_remoteportm(com); 
	if(!result) 
	{ 
		AfxMessageBox("打开串口失败"); 
		return FALSE; 
	} 
	char cfBuffer[nLoadlength+1]; 
	while(nFilelength>=0) 
	{ 
		memset(cfBuffer,'\0',nLoadlength+1); 
		int nReadlength=cf.Read(cfBuffer,nLoadlength); 
		char Resource[2049]; 
		if(nReadlength==0) 
		{			 
			if(nFilelength>0) 
			{ 
			Port_Res(); 
			cf.Close(); 
			AfxMessageBox("文件中没有数据,安装不成功"); 
			return FALSE; 
			} 
			else 
			{ 
			memset(Resource,'\0',2049); 
			result=PORT_RW(END,Resource); 
			Port_Res(); 
			cf.Close(); 
       
			} 
			 
		} 
		if(nReadlength==1024) 
		{ 
			memset(Resource,'\0',2049); 
 
			for(i=0;i<1024;i++) 
			{ 
				Resource[2*i]=(cfBuffer[i]>>4)&0x0f; 
					if(Resource[2*i]>=10) 
                      Resource[2*i]=Resource[2*i]-10+0x41; 
                    else 
                      Resource[2*i]=Resource[2*i]+0x30; 
 
				Resource[2*i+1]=(cfBuffer[i])&0x0f; 
                    if(Resource[2*i+1]>=10) 
                      Resource[2*i+1]=Resource[2*i+1]-10+0x41; 
                    else 
                      Resource[2*i+1]=Resource[2*i+1]+0x30; 
            } 
			result=PORT_RW(SEND,Resource); 
			if(result==FALSE) 
			{ 
				AfxMessageBox("串口通讯有错误!"); 
				break; 
			} 
		} 
		if(nReadlength<1024) 
		{ 
			char Buffer[2049]; 
			memset(Buffer,'\0',2049); 
			memset(Resource,'\0',2049); 
 
            for(i=0;i>4)&0x0f; 
				Resource[2*i+1]=(cfBuffer[i])&0x0f; 
 
				if(Resource[2*i]>=10) 
					Resource[2*i]=Resource[2*i]-10+0x41; 
				else 
					Resource[2*i]=Resource[2*i]+0x30; 
				if(Resource[2*i+1]>=10) 
					Resource[2*i+1]=Resource[2*i+1]-10+0x41; 
				else 
					Resource[2*i+1]=Resource[2*i+1]+0x30; 
			} 
			for(i=0;i<2048-2*nReadlength;i++) 
				Buffer[i]=0x46; 
			strcat(Resource,Buffer); 
			result=PORT_RW(SEND,Resource); 
		} 
		if(result==FALSE) 
		{ 
			Port_Res(); 
			cf.Close(); 
			return FALSE; 
		} 
		else 
			nFilelength=nFilelength-1024; 
	} 
    return TRUE; 
 
}