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

📄 552io.c

📁 dos下pos机程序 连接sybase数据库 使用Microsoft c7 编译
💻 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 + -