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

📄 comm.cpp

📁 VC++串口编程教学源码,串口学习的好东西
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <afxwin.h> 
#include "comm.h"
#include <io.h>


int IsAllSame(const unsigned char* abIn,int nLength) 
{
	for(int i=1;i<nLength;i++)
	{
		if(abIn[i]!=abIn[0]) return 0;
	}
	return abIn[0];
}

/*把src中的高字节和低字节调换后写入dst所指地址*/
void ExchangeHILO(unsigned short src,unsigned short *dst)
{
	unsigned short tmp;
	tmp=src>>8;
	*dst=src<<8;
	*dst|=tmp;
}



CComm::CComm()
{
	m_dcb.BaudRate = 56000;
	m_pOutXML=NULL;
	m_pInXML=NULL;
}

CComm::~CComm()
{

}

	
BOOL CComm::Device2Bin()
{
	
   DWORD    start;
   int      nLength,ci;

   BYTE     abIn[ MAXBLOCK],*buf,*bufp,*bufp1,*old_bufp;

   BYTE     SYN[1]={0x1};
   BYTE		ACK[1]={0x2};
   BYTE     RESEND[1]={0x4};
   BYTE		ASK[6]={0,0,0,1,0,1};
   BYTE		BYE[3]={6,0,6};
   BYTE		BUSY[1]={0x7};
   int		step;
   FILE		*RSF;
   long		filelen,readlen,totallen,templen;
   WORD		check;
   int		packf;
   int      ReSendSum;
   BOOL     bRet=TRUE; 
   WORD     nRecord=0;

   	RSF=fopen(m_PdaFileName,"wb");
	if(!RSF)
	{
		SendCommMsg(CSM_EXCEPTION,0);
		return FALSE;
	}
	buf=(BYTE*)malloc(MAXBLOCK*10);
	if(!buf)
	{
		SendCommMsg(CSM_EXCEPTION,0);
		fclose(RSF);
		return FALSE;
	}

	nLength=0;
	start=GetTickCount();

    step=0;totallen=0;packf=0;
	
	bufp=buf;

	if (!WaitSYN(100))
	{
		bRet=FALSE;
		return bRet;
	}
	do
	{
		if(!m_bConnected) 
		{
			bRet=FALSE;
			break;
		}
		nLength =ReadCommBlock( (LPSTR) abIn, MAXBLOCK );
		if((GetTickCount()-start)>MAXTIME)
		{
				SendCommMsg(CSM_TIMEOUT,0);  
				bRet=FALSE;
				break;
		}
	    switch(step)
		{
		case 0:
		{
			   if((nLength>=1)&&(IsAllSame(abIn,nLength)==SYN[0])) 
			   {
				   step=1;
				   ReSendSum=3; 
				   start=GetTickCount();
				   WriteCommBlock( (LPSTR)ACK, 1);
			   }
			   else if(nLength==0)
				   break;
			   else
			   {
				   SendCommMsg(CSM_SYNERROR,0);  
				   bRet=FALSE;
			   }
			   break;
		}
		case 1:
		{
			   if((nLength>=1)&&(IsAllSame(abIn,nLength)==SYN[0])) 
			   {
				   WriteCommBlock( (LPSTR)ACK, 1);
				   break;
			   }
			   if(nLength==0)
				   break;
			   
			   if((nLength==6)&&(abIn[0]==0)&&(abIn[1]==0)) 
			   {	
				    start=GetTickCount();	
					check=0;
					
					if (ReSendSum==0) 
					{
						SendCommMsg(CSM_DATAERROR,0);  
						bRet=FALSE;
						break;
                    }

					check+=abIn[2]+(abIn[2]&0x80?0xff00:0);
					check+=abIn[3]+(abIn[3]&0x80?0xff00:0);
					
					if((BYTE(check>>8)!=abIn[4])||(BYTE(check&0xff)!=abIn[5]))
					{
						step=1;
						ReSendSum--;
						WriteCommBlock( (LPSTR)RESEND, 1);
					}
					else
					{
						ReSendSum=3; 
						memcpy(bufp,abIn,6);
						bufp+=6;
						if((abIn[3]==1)&&(abIn[4]==0)&&(abIn[5]==1)) 
						{
							step=4;
							fwrite("\0\0\0\x1\0\x1",1,6,RSF);
						}
						else
						{	
							step=3;
							filelen=(((long)abIn[2]<<8)+(long)abIn[3])+(long)2;
						}
						WriteCommBlock( (LPSTR)ACK, 1);
					}
			   }
			   else
			   {
				   SendCommMsg(CSM_DATAERROR,0);  
				   bRet=FALSE;
			   }

			   break;
		}
		case 2:
		{
			   if((nLength>=1)&&(IsAllSame(abIn,nLength)==SYN[0]))
			   {	
				   start=GetTickCount();
				   ReSendSum=3;
				   step=1;
				   if(packf==0) nRecord++;
				   if(nRecord)				   
					   SendCommMsg(CSM_RUNNING,nRecord);
				   WriteCommBlock( (LPSTR)ACK, 1);
			   }
			   if(nLength==0) break;
			   if((nLength>0)&&(abIn[0]==BUSY[0]))
			   {	
				   start=GetTickCount();
				   WriteCommBlock( (LPSTR)ACK, 1);
			   }
			   break;
		}
		case 3:
		{
			   step=2;
			   check=0;
			   readlen=0;
			   old_bufp=bufp;
			   start=GetTickCount();
			   do
			   {	
					nLength = ReadCommBlock( (LPSTR) abIn, MAXBLOCK );
					if(nLength>0)
					{	
						start=GetTickCount();
						memcpy(bufp,abIn,nLength);
						bufp+=(long)nLength;
						for(ci=0;ci<nLength;ci++) 
							check+=abIn[ci]+(abIn[ci]&0x80?0xff00:0);
						readlen+=(long)nLength;
					}
					if((GetTickCount()-start)>RSDTIME)
						break;
			   }while(readlen<filelen);

				check-=(*(bufp-1)+(*(bufp-1)&0x80?0xff00:0));
				check-=(*(bufp-2)+(*(bufp-2)&0x80?0xff00:0));

				if((readlen<filelen)||
				      ((check>>8)!=*(bufp-2))||((check&0xff)!=*(bufp-1)))
				{	
					bufp=old_bufp;
					step=3;
					if (ReSendSum>0)
					{
						ReSendSum--;
						WriteCommBlock( (LPSTR)RESEND, 1);
					} 
					else
					{
						SendCommMsg(CSM_DATAERROR,0);  
						bRet=FALSE;
					}
					break;
				}
				else
				{
					nRecord++;
					SendCommMsg(CSM_RUNNING,nRecord);
				}
					

					totallen+=filelen-16-2;
					templen=((long)buf[6+14]<<8)+buf[6+15];

					switch(packf)
					{
					case 0: if(totallen<templen)
							{	
								packf=1;
								buf[2]=(templen+16)>>8;
								buf[3]=(templen+16)&0xff;
								bufp1=bufp;
							}
							else
							{	
								fwrite(buf,1,(long)(bufp-buf),RSF);
								bufp=buf;
								totallen=0;
							}
							break;
					case 1: if(totallen<templen)
							{
								memcpy(bufp1-2,bufp1+6+16,(long)(bufp-bufp1-6-16));
								bufp1=bufp-6-16-2;bufp=bufp1;
							}
							else
							{	
								packf=0;
								totallen=0;
								memcpy(bufp1-2,bufp1+6+16,(long)(bufp-bufp1-6-16));
								fwrite(buf,1,(long)(bufp-6-16-2-buf),RSF);
								bufp=buf;
							}
							break;
					default: break;
					}
			
				
				WriteCommBlock( (LPSTR)ACK, 1);
			    break;
		}
		case 4:
		{
			if((nLength==3)&&(abIn[0]==6)&&(abIn[1]==0)&&(abIn[2]==6))
			   {
				    start=GetTickCount();
					step=5;
				   	WriteCommBlock( (LPSTR)ACK, 1);
			   };
			   break;
		}
		default:
			   break;
		};
	}while((step<5)&&(bRet));

	if(step==5)	
		;
	else 	
		fwrite("\0\0\0\x1\0\x1",1,6,RSF);

	free(buf);
	fclose(RSF);
   	return 	bRet;
}

  
BOOL CComm::Bin2Device()
{
   DWORD       start;
   int         nLength;

   BYTE        abIn[ MAXBLOCK + 1],*buf,*bufp,*old_bufp,*tempbufp;

   BYTE		SYN[1]={0x1};
   BYTE		ACK[1]={0x2};
   BYTE		RESEND[1]={0x4};
   BYTE		ASK[6]={0,0,0,1,0,1};
   BYTE		BYE[3]={6,0,6};
   BYTE		BUSY[1]={0x7};
   int		step,old_step;
   FILE		*RSF;
   long		filelen,templen,totallen,old_len;
   WORD		check,ci;
   int		packf,packf1;
   BOOL     bRet=TRUE;
   WORD     RecordNum=0;

    RSF=fopen(m_PdaFileName,"rb");
	if(!RSF)
	{
		SendCommMsg(CSM_EXCEPTION,0);
		return FALSE;
	}
	filelen=_filelength(_fileno(RSF));
	buf=(BYTE*)malloc(filelen);
	if(!buf)
	{
		SendCommMsg(CSM_EXCEPTION,0);
		fclose(RSF);
		return FALSE;
	}
	fread(buf,1,filelen,RSF);
	fclose(RSF);

	step=0;
	bufp=buf;
	old_step=step;
	old_bufp=bufp;
	totallen=0;
	packf=0;
	packf1=0;

	nLength=0;
	start=GetTickCount();
	
	if (!SendSYN(100))
	{
		SendCommMsg(CSM_SYNERROR,0);
		goto finish;
	}
	do{
		if(!m_bConnected) 
		{
			SendCommMsg(CSM_KILLED,0);
			bRet=FALSE;
			break;
		}
		nLength = ReadCommBlock( (LPSTR) abIn, MAXBLOCK);
	
	    if((nLength>=1) && (IsAllSame(abIn,nLength)==RESEND[0]))					
		{
			bufp=old_bufp;
			step=old_step;
		}

		if((nLength>=1) && ((IsAllSame(abIn,nLength)==ACK[0])
						   ||(IsAllSame(abIn,nLength)==RESEND[0])))
		{
		start=GetTickCount();
		switch(step)
		{
		case 0:
			
			if(abIn[0]!=RESEND[0])
			{
				old_step=step;
				old_bufp=bufp;
				templen=(((long)bufp[2]<<8)+bufp[3])+2;

					if(packf==0)
					{	
						packf1=0;
						totallen=templen-2;
						if(totallen>0x1000)
						{	
							packf=1;
							totallen-=0x1000;
							bufp[2]=0x10;
							bufp[3]=0;
							templen=0x1000+2;
						}
						check=bufp[2]+(bufp[2]&0x80?0xff00:0)+bufp[3]+(bufp[3]&0x80?0xff00:0);
						bufp[4]=check>>8;
						bufp[5]=check&0xff;
						tempbufp=bufp;
						bufp+=6;
					}
					else if(packf==1)
					{	
						packf1=1;
						if(totallen>0x1000)
						{	
							totallen-=(0x1000-16);
							templen=0x1000+2;
						}
						else
						{	
							packf=0;
							tempbufp[2]=(totallen+16)>>8;tempbufp[3]=(totallen+16)&0xff;
							check=tempbufp[2]+(tempbufp[2]&0x80?0xff00:0);
							check+=tempbufp[3]+(tempbufp[3]&0x80?0xff00:0);
							tempbufp[4]=check>>8;tempbufp[5]=check&0xff;
							templen=totallen+2+16;
						}
					}
			}

 			else if(packf1==0) bufp+=6;
			WriteCommBlock((LPSTR)tempbufp,6);

			step=1;
			if(templen==3) step=4;   
				   
		   break;
		case 1:
			if(abIn[0]==RESEND[0]) 
				templen=old_len;
			else 
				old_len=templen;

		    old_step=step;
			old_bufp=bufp;
			check=0;
			if(packf1==1)
			{	
				WriteCommBlock((LPSTR)tempbufp+6,16);
				for(ci=6;ci<6+16;ci++) 
					check+=tempbufp[ci]+(tempbufp[ci]&0x80?0xff00:0);
				templen-=16;
			}
			while((templen-2)>=MAXBLOCK)
			{
				WriteCommBlock((LPSTR)bufp,MAXBLOCK);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -