📄 552io.c
字号:
/***************************************************
** PROGRAM: 552io.c **
** AUTHOR: kenny **
** WRITE DATE: 05/10/1997 **
** LAST MODIFY DATE: 05/10/1997 **
** JOIN FILE: **
** COMMENT: 商场银行卡交易系统 SC552接口程序 **
** **
***************************************************/
#include "card.h"
/*
* posio() -- 与SC552通信接口
* para -- sendptr: 发送字符串;
* port: 发送端口[COM1/COM2];
* timeout: 超时限制;
* type: 通信类型[1: 只发送不接收, 2: 接收结果]
* return -- 接收字符串
*/
char *posio(char *sendptr, int port, int timeout, int type)
{
char rcvptr[256];
open_com_port(port, BAUD_9600);
if (type == 1)
posio_1(sendptr, timeout, rcvptr);
else
posio_2(sendptr, timeout, rcvptr);
close_com_port();
return(rcvptr);
}
/*
* posio_1() -- 发送至SC552但不接收结果; 发送不正确时要重发, 最多三次
* para -- sendptr: 发送字符串
* timeout: 超时限制
* rcvptr: 接收字符串
* return -- TRUE: 成功, FALSE: 失败
*/
int posio_1(char *sendptr, int timeout, char *rcvptr)
{
int i;
long time0;
time0 = time(NULL);
for (i=0; ; i++)
{
if (i == 3)
{
rcvptr[0] = NAK;
rcvptr[1] = 0;
return(FALSE);
}
send_pack(sendptr);
while (!have_pack())
{
if ((time(NULL) - time0 > timeout) || (kbhit() && getch()==27))
{
rcvptr[0] = NAK;
rcvptr[1] = 0;
return(FALSE);
}
}
dec_pack();
if (receive_pack(rcvptr) && *rcvptr == ACK)
return(TRUE);
}
}
/*
* posio_2() -- 发送至SC552但并接收结果; 发送不正确时要重发, 最多三次
* para -- sendptr: 发送字符串
* timeout: 超时限制
* rcvptr: 接收字符串
* return -- TRUE: 成功, FALSE: 失败
*/
int posio_2(char *sendptr, int timeout, char *rcvptr)
{
long time0;
if (posio_1(sendptr, timeout, rcvptr) != TRUE)
return(FALSE);
sendptr[0] = ENQ;
sendptr[1] = 0;
time0 = time(NULL);
while (1)
{
send_pack(sendptr);
while (!have_pack())
{
if ((time(NULL) - time0 > timeout) || (kbhit() && getch()==27))
{
rcvptr[0] = NAK;
rcvptr[1] = 0;
return(FALSE);
}
}
dec_pack();
if (receive_pack(rcvptr) && *rcvptr>' ')
{
return(TRUE);
}
delay(10);
}
}
/*
* send_pack() -- 发送包文
* para -- send_str: 待发送的包文(不包含STX和ETX)
* return -- 无
*/
void send_pack(unsigned char *send_str)
{
int i;
switch (*send_str)
{
case ACK:
case NAK:
case ENQ:
com_out(*send_str);
return;
default:
com_out(STX);
for (i=strlen(send_str); i>0; i--)
com_out(*send_str++);
com_out(ETX);
return;
}
}
/*
* receive_pack() -- 接收包文
* para -- receive_str: 接收到的字符串(不包含STX和ETX)
* return -- TRUE: 成功, FALSE: 失败
*/
int receive_pack(unsigned char *receive_str)
{
unsigned char c, Start;
int i;
Start=FALSE;
while (1)
{
if (com_in(&c))
{
switch (c)
{
case STX:
Start=TRUE;
i=0;
break;
case ETX:
if (Start)
{
receive_str[i]='\0';
return TRUE;
}
else
return FALSE;
case ACK:
case NAK:
case ENQ:
receive_str[0]=c;
receive_str[1]='\0';
return TRUE;
default:
if (Start && c>=0x20 && c<0x7f)
receive_str[i++]=c;
break;
}
}
else
return FALSE;
}
}
/* 以下为中断处理的有关函数 */
/* For COM1 Port */
#define COMM_DATA1 0x3f8
#define COMM_ICR1 0x3f9
#define COMM_IIR1 0x3fa
#define COMM_MCR1 0x3fc
#define COMM_LSR1 0x3fd
#define COMM_INT1 0x0c
#define INT_MASK1 0x10
/* For COM2 Port */
#define COMM_DATA2 0x2f8
#define COMM_ICR2 0x2f9
#define COMM_IIR2 0x2fa
#define COMM_MCR2 0x2fc
#define COMM_LSR2 0x2fd
#define COMM_INT2 0x0b
#define INT_MASK2 0x08
#define PIC_MASK 0x21
#define PIC_EOI 0x20
#define COMBUFLEN 512
unsigned int comm_data, comm_icr, comm_iir, comm_mcr, comm_lsr;
unsigned char comm_int, int_mask;
static char com_in_buf[COMBUFLEN];
int com_in_head=0;
int com_in_tail=0;
int in_pack_count=0;
static char com_out_buf[COMBUFLEN];
int com_out_head=0;
int com_out_tail=0;
static char out_int_enb=0;
void interrupt(* OldComInt)();
//void (* OldComInt)();
/*
* com_int() -- 中断处理
*/
void interrupt com_int (/* unsigned bp, unsigned di, unsigned si, unsigned ds,
unsigned es, unsigned dx, unsigned cx, unsigned bx,
unsigned ax */)
{
char lsr, ch;
lsr = inportb(comm_lsr);
if ((lsr&0x01) != 0)
{
ch = inportb(comm_data);
*(com_in_buf+com_in_tail++) = ch;
if (com_in_tail >= COMBUFLEN)
com_in_tail = 0;
if (ch==ACK||ch==NAK||ch==ENQ||ch==ETX)
in_pack_count++;
}
if ((lsr&0x20) != 0)
{
if (com_out_head != com_out_tail)
{
outportb(comm_data, *(com_out_buf+com_out_head++));
if (com_out_head >= COMBUFLEN)
com_out_head = 0;
}
else
{
outportb(comm_icr, 1);
out_int_enb = 0;
}
}
outportb(PIC_EOI, 0x20);
}
/*
* com_in() -- 从端口接收字符串
* para -- cp: 接收到的字符串
* return -- TRUE: 成功, FALSE: 失败
*/
int com_in(char *cp)
{
char ch;
if (com_in_head == com_in_tail)
return FALSE; /* EMPTY */
*cp = *(com_in_buf+com_in_head++);
if (com_in_head >= COMBUFLEN)
com_in_head = 0;
return TRUE;
}
/*
* com_out() -- 向端口发送字符
* para -- ch: 待发送的字符
* return -- TRUE: 成功, FALSE: 失败
*/
int com_out(char ch)
{
*(com_out_buf+com_out_tail++) = ch;
if (com_out_tail >= COMBUFLEN)
com_out_tail = 0;
if (out_int_enb == 0)
{
disable();
outportb(comm_icr, 3);
out_int_enb = 1;
enable();
}
return(TRUE);
}
/*
* have_pack() -- 检测端口是否有包文
* para -- 无
* return -- TRUE: 有, FALSE: 无
*/
int have_pack( void )
{
int InPackCount;
disable();
InPackCount=in_pack_count;
enable();
if (InPackCount > 0)
return TRUE;
else
return FALSE;
}
/*
* dec_pack() -- 递减包文数
* para -- 无
* return -- TRUE: 成功, FALSE: 失败
*/
int dec_pack( void )
{
disable();
in_pack_count--;
enable();
return(TRUE);
}
/*
* open_com_port() -- 打开并初始化端口
* para -- Port: 端口
* Baud: 波特率
* return -- TRUE: 成功, FALSE: 失败
*/
int open_com_port(int Port, int Baud)
{
static union REGS inregs, outregs;
unsigned char ch;
if (Port==COM1)
{
comm_data = COMM_DATA1;
comm_icr = COMM_ICR1;
comm_iir = COMM_IIR1;
comm_mcr = COMM_MCR1;
comm_lsr = COMM_LSR1;
comm_int = COMM_INT1;
int_mask = INT_MASK1;
}
else
{
comm_data = COMM_DATA2;
comm_icr = COMM_ICR2;
comm_iir = COMM_IIR2;
comm_mcr = COMM_MCR2;
comm_lsr = COMM_LSR2;
comm_int = COMM_INT2;
int_mask = INT_MASK2;
}
inregs.h.ah = 0;
inregs.h.al = Baud;
inregs.x.dx = 0;
int86(0x14, &inregs, &outregs);
OldComInt = (void *)getvect(comm_int);
disable();
setvect(comm_int, com_int);
outportb(comm_mcr, 0x0b);
outportb(comm_icr, 1);
out_int_enb = 0;
ch = inportb(PIC_MASK);
ch &= ~int_mask;
outportb(PIC_MASK, ch);
enable();
return(TRUE);
}
/*
* close_com_port() -- 关闭端口
* para -- Port: 端口
* return -- TRUE: 成功, FALSE: 失败
*/
int close_com_port()
{
unsigned char ch;
out_int_enb = 0;
disable();
outportb(comm_icr, 0);
ch = inportb(PIC_MASK);
ch |= int_mask;
outportb(PIC_MASK, ch);
setvect(comm_int, OldComInt);
enable();
return(TRUE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -