📄 b.c
字号:
/**This is aleaned line communication program**/#include <stdio.h>#include <fcntl.h>#include <signal.h>#include <termio.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#define MAXLINE 80#define TIMEOUT 10#define KEYS 60#define KEYR 61#define TXBUFLEN 200#define START_CHAR 0xfe#define END_CHAR 0xfd#define STX 0x02#define ETX 0x03#define ENQ 0x05#define ACK 0x06#define NAK 0x15#define FS 0x1c#define FAIL -1#define FAIL_TIMEOUT -2#define TIMEOUT1 30char *strchr();static int timeout=0;static char *termname;unsigned char buff[300],sndbuf[TXBUFLEN],rcvbuf[TXBUFLEN];struct tx_type{ //char acct_card[9]; /* 证券资金卡号 */ char acct_card[8]; /* 证券资金卡号 */ char card[20]; /* 银行卡号 */ char pos_date[9]; /* 交易日期 */ char tid[9]; /* POS终端号 */ char mid[16]; /* POS商户号 ** */ char id[3]; /* POS操作员号 */ char proc_code[3]; /* 处理码 : 01 银行转出, 02 证券转出 41 冲正01 , 42 冲正02 */ char amount[13]; /* 交易金额: 除以100为真实金额 */ char trace_num[7]; /* 票据号 */ char resp_code[4]; /* 返回码 */ char pin[9]; /* 密码 */ }; struct stock_type{ char database_flag; char szgddm[8]; char shgddm[10]; char czh[8]; char yhzh[20]; char sfzh[15]; char htxh[6]; char qsdm[6]; char yhdm[2]; char cqlb; char je[10]; char wtrq[8]; char wtsj[8]; char czmm[6]; char bmjy[40]; char fsbz; char clbz; char cjbz; char errmsg[4]; char sl[8]; char zqdm[6]; char ye[12]; char kys[12]; char tid[9]; }; txexit(){ fprintf(stderr,"COMMUNICATION program exit\n\r"); exit(0);}static int readout(){ timeout=1;}static int settimeout(){ fprintf(stderr,"timeout on opening %s\n\r",termname); timeout=1;}main(argc,argv)int argc;char *argv[];{ int speed=B9600; int ttyid,i,len; long msgtype; unsigned char buf[100]; signal(SIGINT, txexit); signal(SIGTERM,txexit); signal(SIGUSR1,txexit); signal(SIGCLD,SIG_IGN); if (argc<2||argc>4) { fprintf(stderr,"usage:nfcomm ttyname [speed]\n\r"); exit(1); } if ((ttyid=ttyopen(argv[1],O_RDWR))==-1) { /*fprintf(stderr,"cannot open %s\n\r",argv[1]);*/ fprintf(stderr,"打开 %s 失败\n\r",argv[1]); exit(1); } if (!isatty(ttyid)) { fprintf(stderr,"设备 %s not a tty\n\r",argv[1]); exit(1); } if (argc==3&&(speed=getspeed(argv[2]))==-1) { fprintf(stderr,"Invalid speed specified\n\r"); exit(1); } if (tty_raw(ttyid,speed,1,0)==-1) { fprintf(stderr,"%s ioctl error\n\r",argv[1]); exit(1); } sbqstop(); printf("here %d\n",ttyid); sprintf(buf,"ATDT0,13311000201%c",13); write(ttyid,buf,strlen(buf)); l1: goto l1; gets(buf); exit(1); i=fork(); if(i==0) { exit(0); snd(ttyid); } else if(i>0) rcv(ttyid); else fprintf(stderr,"Fork error \n\r");}tty_raw(fd,speed,min,time)int fd,speed,min,time;{ struct termio fdbuf; if (!isatty(fd)) return(-1); if (ioctl(fd,TCGETA,&fdbuf)==-1) return(-1); fdbuf.c_iflag=0; fdbuf.c_oflag=0; fdbuf.c_lflag=0; fdbuf.c_cflag&=~CBAUD; /*mask off baud rate*/ fdbuf.c_cflag|=speed; /*set new bps=speed*/ fdbuf.c_cflag&=~PARENB; /*NO check */ fdbuf.c_cflag&=~CSIZE; /*mask off size*/ fdbuf.c_cflag|=CS8; /*set new size=8 bit*/ fdbuf.c_cflag&=~CSTOPB; /*1 stop bit*/ fdbuf.c_cc[VMIN]=min; fdbuf.c_cc[VTIME]=time; return ioctl(fd,TCSETAW,&fdbuf);} getspeed(s)char *s;{ int speed; switch(atoi(s)) { case 300: speed=B300; break; case 1200: speed=B1200; break; case 2400: speed=B2400; break; case 4800: speed=B4800; break; case 9600: speed=B9600; break; default: speed=-1; } return speed;}ttyopen(filename,flag)char *filename;int flag;{ int (*sigfn)(),fd=-1; termname=filename; timeout=0; sigfn=signal(SIGALRM,settimeout); alarm(TIMEOUT); fd=open(filename,flag); alarm(0); signal(SIGALRM,sigfn); return(timeout ? -1:fd);}rcv(fd)int fd;{ int i,n; unsigned char c; FILE *fp; struct stock_type *stock_ptr; long msgtype; char buf[4]; unsigned char flag; stock_ptr=(struct stock_type *)malloc(sizeof(struct stock_type)); signal( SIGUSR1, txexit ); if((fp=fopen("log.rcv","a"))==NULL){ fprintf(stderr,"log.rcv权限不够或文件被锁!\n\r"); exit(-1); } while(1) { i=0; /*---- read tty ----*/ do { read(fd,&c,1); //fprintf(stderr,"%02x ",c); }while(c!=START_CHAR); memset( rcvbuf, '\0', TXBUFLEN ); do { if ((n=read(fd,&c,1))!=1) { /*fprintf(stderr,"read comm_port fail!\n\r");*/ fprintf(stderr,"读串口失败 !\n\r"); continue; } if (c==END_CHAR) break; //fprintf(stderr," [%x] ",c); rcvbuf[i]=c; i++; }while(c!=END_CHAR); n=i; /*fprintf(stderr,"i=%d\n",i);*/ fprintf(stderr,"receive report:\n"); for(i=0;i<n;i++) { fprintf(stderr,"%02x ",rcvbuf[i]); } fprintf(stderr,"\nreceive report:ok \n"); stock_ptr=(struct stock_type *)rcvbuf; /* write rcv msg */ } fclose(fp);}snd(fd)int fd;{ int len,i,n; unsigned char c,channelno; FILE *fp; char buff[300],buf[TXBUFLEN]; struct stock_type *stock_ptr; long msgtype; char buf_channel[4]; stock_ptr=(struct stock_type *)malloc(sizeof(struct stock_type)); memset(buf_channel,0,4); while(1) { if((fp=fopen("log.snd","a"))==NULL){ fprintf(stderr,"log.snd权限不够或文件被锁!\n\r"); exit(-1); } /* read snd msg */ memset(sndbuf,0,TXBUFLEN); msgtype=0L;/* if ((len=receive(KEYS,sndbuf,&msgtype,0)) == FAIL) { fprintf(stderr,"Receive queue KEYS failed:\n\r"); exit(FAIL); } else if (len == FAIL_TIMEOUT) { fprintf(stderr,"Receive queue KEYR timeout:\n\r"); continue; } else fprintf(stderr,"RECEIVE FROM queue KEYS SUCCESS!!!\n\r"); fprintf(stderr,"len=%d ",len); */ stock_ptr=(struct stock_type *)sndbuf; fprintf(stderr,"write ls ok!\n\r"); fclose(fp); /* write tty */ //n=atoi(stock_ptr->tid); memcpy(buf_channel,stock_ptr->tid,4); buf_channel[3] = 0; n = atoi(buf_channel); channelno=n; c=START_CHAR; if ((n=write(fd,&c,1))!=1) { /*fprintf(stderr,"write comm_port fail !\n\r");*/ fprintf(stderr,"写串口失败 !\n\r"); continue; } else fprintf(stderr,"n=%d write START_CHAR ok\n\r",n); fprintf(stderr,"channelno=%x\n",channelno); if ((n=write(fd,&channelno,1))!=1) { /*fprintf(stderr,"write comm_port fail!\n\r");*/ fprintf(stderr,"写串口失败 !\n\r"); continue; } else fprintf(stderr,"n=%d write channelno ok\n\r",n); i=0; while(i<len){ c=sndbuf[i]; i++; if ((n=write(fd,&c,1))!=1) { /* fprintf(stderr,"write comm_port fail!\n\r");*/ fprintf(stderr,"写串口失败 !\n\r"); continue; } else fprintf(stderr," [%x] ",c); } c=END_CHAR; if ((n=write(fd,&c,1))!=1) { /*fprintf(stderr,"write comm_port fail!\n\r");*/ fprintf(stderr,"写串口失败 !\n\r"); continue; } else /*printf(" [%x] ",c);*/ fprintf(stderr,"n=%d WRITE END CHAR ok\n\r",n); }} int sbqstop() { }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -