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

📄 comm.h

📁 一个C++语言编写的程序
💻 H
字号:
/*****************************
comm.h:终端与支付密码器通讯协议
编制人:朱慧
编制日期:2001/8/28
修改日期:
上层调用:comm.c
*******************************/
#include "Communication.h"
#include <iostream.h>
#include <string.h>
#include <stdio.h>
#define DEBUG		0	/*	调试程序用		*/
	

#define PACKLEN		25620	/*	帧最大长度		*/

#define SOH	            0x18	/*	帧头			*/
#define ENQ	            0x05	/*	帧尾			*/
#define ACK             0x06    
#define SEND            0x2A
#define END             0x19
#define RIGHT           0x07
#define ERR             0x08

#define QUITKEY		0xff
#define ITEM_LEN	249


/*	TAG		*/
char Send_Buff[PACKLEN];	/*	Send Buffer		*/
char Rece_Buff[PACKLEN];	/*	Rece Buffer		*/


CComStatus m_comDev;		//	COMM32类

/*	此处程序供串口使用		*/

/*	初始化串口	*/
int Port_Init(int com)
{

	m_comDev.m_bComId = com;

	if (!m_comDev.OpenConnection())
		return false;
	else 
		return true;

}

/*	恢复串口	*/
int Port_Res()
{
	return m_comDev.CloseConnection();
}

/*	发送字符串	*/	
int Out_Port(char *H)
{
	int i,temp_len=0;
	char buf[2];
	int result;

	temp_len=strlen(H);

  	for(i=0;i<temp_len;i++)
	{
		buf[0]=H[i];	
		buf[1]='\0';
		result=WriteCommBlock(m_comDev,buf,strlen(buf));
		if(result==false)
		{
			cout<<"发送字符串出错"<<endl;
			return false;
		}
	}
	return true;
}
/*	接收一个字符	*/
int In_Port(char *temp)
{
    char s='\0';

	if (::ReadCommBlock(m_comDev,&s,1)==1)
	{
		*(temp)=s;
		return true;
	}
	else
		return false;

}

/*建立通路*/
int Make_Roadm()
{
	char temp=0;
	int result=0,i=0;
	char buffer[2];
	long time_out=0;
	memset(buffer,'\0',2);
	for(time_out=0;time_out<8;time_out++)
	{
		buffer[0]=ENQ;
		buffer[1]='\0';

		result=Out_Port(buffer);

        result=In_Port(&temp);

		if ((result==true) && (temp==ACK))
			break;
	}
/***********************************
         新添加程序段 2003.4.4
************************************/
	for(time_out=0;time_out<1000;time_out++)
	{
		buffer[0]=ENQ;
		buffer[1]='\0';

	   result=Out_Port(buffer);
       result=In_Port(&temp);

    if ((result==true) && (temp==ACK))
			break;
	}
	if (time_out>=1000)
	{
		return false;
	}

	return true;
}
/*打开串口*/
bool 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;
}





/*	打包程序	*/
int Make_Itemm(int Mode,char *buffer)
{
	int i=0;
    char Temp[2054],s[3];
    int j=0;
	int x=0;
	static unsigned  char xh=1;

	memset(Send_Buff,'\0',2056);
	memset(Temp,'\0',2055);
	Temp[0]=SOH;			/*	Start char	*/
	Temp[1]=xh++;
	if ((int)xh==0)		xh=1;
    if ((int)xh==127)   xh=1;
	cout<<"xh:="<<(int)xh<<endl;
	Temp[2]=(char)Mode;	/*	Command code	*/
	                    /*  Temp[3],Temp[4] 表示数据长度   */
	if(strlen(buffer)==0)
	{
		Temp[3]=0xff;
		Temp[4]=0xff;
		Temp[5]='\0';
		j=Temp[0]+Temp[1]+Temp[2]+0x0f+0xf0+0x0f+0xf0;
	}
	else
	{
		Temp[3]=0x08;
		Temp[4]=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]=0xff;
	s[1]=j&0xff;
	if((int)s[1]==0) s[1]=0xff;
	s[2]='\0';
	strcat(Temp,s);

	strcpy(Send_Buff,Temp);

	return (true);
}


/*		校验接收字符串			*/
int Check_Recem(char *buffer, int *Mode)
{
	int i;
	char Temp;
	char ss[3];

	*Mode=-1;
	if (buffer[0]!=SOH)
		return false;

	for(i=0,Temp=0;i<(strlen(buffer)-2);i++)
	{
		Temp+=buffer[i];
    }
	if ((int)Temp==0)  Temp--;

	ss[0]=Temp&0xff;
	if((int)ss[0]==0) ss[0]=0xff;
	ss[1]=(Temp>>8)&0xff;
        if((int)ss[1]==0) ss[1]=0xff;

    if((ss[1]==buffer[strlen(buffer)-2])||(ss[0]==buffer[strlen(buffer)-1]))
	   {
              *Mode=buffer[2];
	           return true;
        }
		return false;
}



/*		接收程序		*/
int  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)
			{
				cout<<"重发超过三次"<<endl;
				exit_mode=false;
			}
			else	
			{
				Out_Port(Send_Buff);
				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(Rece_Buff,buffer);
        	strcpy(t,buffer);
			statu=0;
	        memset(buffer,'\0',255);
			return (true);
		}
	}
}



/*	过滤帐号				*/
void ACCU_accu(char *inbuf,char outbuf[32])
{
	int i,j;
	
	j=0;
	memset(outbuf,'0',32);

	for(i=strlen(inbuf)-1;i>=0;i--)
	  if (inbuf[i]>='0'&&inbuf[i]<='9')
	  {
		outbuf[31-j]=inbuf[i];
		j++;
	  }
}

bool PORT_RW(int command_set,char *buffer)
{
    char temp[255];
	int result=0,mode=0,i=0;

	memset(temp,'\0',255);
	Make_Itemm(command_set,buffer);

	Out_Port(Send_Buff);
//	static int b=0;
//b++;
	//cout<<"lijian:="<<b++<<endl;
	//printf("b=",b++);
	//if(b%29==0)
	  //cout<<Send_Buff<<endl;
	memset(temp,'\0',255);

	result=Rece_codestrm(0,0,temp);
	if (result==true)
		return true;
	else	
	{
		return false;
	}
}

⌨️ 快捷键说明

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