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