📄 comm.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 + -