📄 comm.c
字号:
/************************************************************************/
/* PROGRAMER: CHAE BYOUNG CHEOL */
/* PROGRAM : COMM.C */
/* COMPILER : BORLAND C/C++ 3.1 FOR DOS */
/************************************************************************/
#include ".\header\main.h"
byte TxBuffer1[COM1BUF_TXSIZE], RxBuffer1[COM1BUF_RXSIZE];
int TxIn1, TxOut1, RxIn1, RxOut1;
byte TxBuffer2[COM2BUF_TXSIZE], RxBuffer2[COM2BUF_RXSIZE];
int TxIn2, TxOut2, RxIn2, RxOut2;
byte TxBuffer3[COM3BUF_TXSIZE], RxBuffer3[COM3BUF_RXSIZE];
int TxIn3, TxOut3, RxIn3, RxOut3;
byte TxBuffer4[COM4BUF_TXSIZE], RxBuffer4[COM4BUF_RXSIZE];
int TxIn4, TxOut4, RxIn4, RxOut4;
word TxTimer, TxTimeOutFlag;
word RxTimer, RxTimeOutFlag;
word DelayCounter; /* TIMER 瘤楷 函荐 */
word CommCounter;
extern word _int11flag;
void __interrupt INT_Comm0(void);
void __interrupt INT_Comm1(void);
void COM_Initialize(int port, long baud, int databit, char parity, int stopbit);
void COM_Close(int port);
int COM_Putchar(int port, unsigned char tc);
int COM_Getchar(int port, byte *);
int COM_Getch(int port, byte *);
void COM_TxEnable(int port);
int COM_Printf(int port, char *format, ...);
int COM_String(int port, const char *format);
int COM_Memory(int, const char *, int);
void COM_DtrContorl(int port, int ctrl);
void COM_ClearBuffer(int port);
int COM_TxBuffer(int port, const char *buffer, int number_of_buffer);
int CheckPrinterBusy(void);
/***********************************************************************/
/* NAME : COM_init */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURNS : */
/***********************************************************************/
void COM_Initialize(int port, long baud, int databit, char parity, int stopbit)
{
word mode;
unsigned divisor;
word COMBASE;
word BAUD;
if (port == COM1 || port == COM2)
{
mode = SPRT_CTL_RSIE_ES | SPRT_CTL_RXIE_ES |
SPRT_CTL_RMODE_ES | SPRT_CTL_TMODE_ES;
switch (databit)
{
case 7:
mode = mode | SPRT_CTL_MODE1_ES | SPRT_CTL_PE_ES;
break;
case 8:
mode = mode | SPRT_CTL_MODE1_ES;
break;
case 9:
mode = mode | SPRT_CTL_MODE3_ES;
break;
}
switch (parity)
{
case 'E':
case 'e':
mode = mode | SPRT_CTL_EVN_ES | SPRT_CTL_PE_ES;
break;
case 'O':
case 'o':
mode = mode | SPRT_CTL_PE_ES;
break;
case 'N':
case 'n':
break;
}
stopbit = stopbit;
switch (baud/10)
{
case 120: BAUD = B1200;
break;
case 240: BAUD = B2400;
break;
case 480: BAUD = B4800;
break;
case 960: BAUD = B9600;
break;
case 1920: BAUD = B19200;
break;
case 2880: BAUD = B28800;
break;
case 3840: BAUD = B38400;
break;
case 5760: BAUD = B57600;
break;
case 7680: BAUD = B76800;
break;
case 11520: BAUD = B115200;
break;
}
switch (port)
{
case COM1:
outpw(SPRT0_CTL, mode);
outpw(SPRT0_BDV, BAUD);
outpw(INT_SPRT0, INT_ENABLE|INT_PRI0);
poke(0x0000, ITYPE_SPRT0*4, FP_OFF(INT_Comm0));
poke(0x0000, ITYPE_SPRT0*4+2,FP_SEG(INT_Comm0));
break;
case COM2:
outpw(SPRT1_CTL, mode);
outpw(SPRT1_BDV, BAUD);
outpw(INT_SPRT1, INT_ENABLE|INT_PRI1);
poke(0x0000, ITYPE_SPRT1*4, FP_OFF(INT_Comm1));
poke(0x0000, ITYPE_SPRT1*4+2,FP_SEG(INT_Comm1));
break;
}
}
}
/***********************************************************************/
/* NAME : Close_Close */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
void COM_Close(int port)
{
switch (port)
{
case COM1: break;
case COM2: break;
case COM3: break;
case COM4: break;
}
}
/***********************************************************************/
/* NAME : NewComm1Int */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
void static __interrupt INT_Comm0(void)
{
OSIntEnter();
if ((inpw(SPRT0_STAT) & 0x0080))
{
RxBuffer1[RxIn1++] = inpw(SPRT0_RX);
if (RxIn1 >= COM1BUF_RXSIZE) RxIn1 = 0;
}
outpw(SPRT0_STAT, 0x00);
outpw(INT_EOI, EOITYPE_SPRT0);
OSIntExit();
}
/***********************************************************************/
/* NAME : NewComm2Int */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
void static __interrupt INT_Comm1(void)
{
OSIntEnter();
if ((inpw(SPRT1_STAT) & 0x0080))
{
RxBuffer2[RxIn2++] = inpw(SPRT1_RX);
if (RxIn2 >= COM2BUF_RXSIZE) RxIn2 = 0;
}
outpw(SPRT1_STAT, 0x00);
outpw(INT_EOI, EOITYPE_SPRT1);
OSIntExit();
}
/***********************************************************************/
/* NAME : COM_putchar */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
int COM_Putchar(int port, unsigned char tc)
{
word COMBASE;
switch (port)
{
case COM1:
while ((inpw(SPRT0_STAT) & SPRT_STAT_TEMT_ES) == 0);
outpw(SPRT0_TX, tc);
while ((inpw(SPRT0_STAT) & SPRT_STAT_TEMT_ES) == 0);
break;
case COM2:
while ((inpw(SPRT1_STAT) & SPRT_STAT_THRE_ES) == 0);
outpw(SPRT1_TX, tc);
break;
case COM3:
SCC_Putchar(0, tc);
break;
case COM4:
SCC_Putchar(1, tc);
break;
}
return 0;
}
/***********************************************************************/
/* NAME : Getchar */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
int COM_Getchar(int port, byte *rc)
{
byte bTemp;
switch (port)
{
case COM1 :
if(RxOut1 == RxIn1)
return 0;
else
*rc=RxBuffer1[RxOut1++];
if (RxOut1 >= COM1BUF_RXSIZE) RxOut1 = 0;
break;
case COM2 :
if(RxOut2 == RxIn2)
return 0;
else
*rc=RxBuffer2[RxOut2++];
if (RxOut2 >= COM2BUF_RXSIZE) RxOut2 = 0;
break;
case COM3 :
/*
if(RxOut3 == RxIn3)
return 0;
else
*rc=RxBuffer3[RxOut3++];
if (RxOut3 >= COM3BUF_RXSIZE) RxOut3 = 0;
*/
if (SCC_Getchar(0, &bTemp))
*rc = bTemp;
else
return 0;
break;
case COM4 :
/*
if(RxOut4 == RxIn4)
return 0;
else
*rc=RxBuffer4[RxOut4++];
if (RxOut4 >= COM4BUF_RXSIZE) RxOut4 = 0;
*/
if (SCC_Getchar(1, &bTemp))
*rc = bTemp;
else
return 0;
break;
}
return 1;
}
/***********************************************************************/
/* NAME : Getch */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
int COM_Getch(int port, byte *rc)
{
byte bTemp;
TIMER_Control2(TIMER1, 1);
RxTimer = 10;
switch (port)
{
case COM1 :
while (RxOut1 == RxIn1)
{
if (!RxTimer)
{
TIMER_Control2(TIMER1, 0);
return FALSE;
}
}
*rc=RxBuffer1[RxOut1++];
if (RxOut1 >= COM1BUF_RXSIZE) RxOut1 = 0;
break;
case COM2 :
while (RxOut2 == RxIn2)
{
if (RxTimer)
{
TIMER_Control2(TIMER1, 0);
return FALSE;
}
}
*rc=RxBuffer2[RxOut2++];
if (RxOut2 >= COM2BUF_RXSIZE) RxOut2 = 0;
break;
case COM3 :
while (1)
{
if (RxTimer)
{
TIMER_Control2(TIMER1, 0);
return FALSE;
}
if (SCC_Getchar(0, &bTemp)) break;
}
*rc=bTemp;
break;
case COM4 :
while (1)
{
if (RxTimer)
{
TIMER_Control2(TIMER1, 0);
return FALSE;
}
if (SCC_Getchar(1, &bTemp)) break;
}
*rc = bTemp;
break;
}
TIMER_Control2(TIMER1, 0);
return 1;
}
/***********************************************************************/
/* NAME : COM_TxEnable */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
void COM_TxEnable(int port)
{
word COMBASE;
switch (port)
{
case COM3: COMBASE = COM3BASE; break;
case COM4: COMBASE = COM4BASE; break;
}
outpw(COMBASE+4, 0x0b);
outpw(COMBASE+1, 0x07);
}
/***********************************************************************/
/* NAME : COM_Printf */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
int COM_Printf(int port, char *format, ...)
{
char str[256];
int cnt=0;
va_list arglist;
va_start(arglist, format);
cnt=vsprintf(str,format,arglist);
COM_String(port, str);
va_end(arglist);
return (cnt);
}
/***********************************************************************/
/* NAME : COM_String */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
int COM_String(int port, const char *format)
{
int nr_of_chars=0;
while(*format)
{
COM_Putchar(port, *format++); /* Out Terminal */
nr_of_chars++;
}
return (nr_of_chars);
}
/***********************************************************************/
/* NAME : COM_Memory */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
int COM_Memory(int port, const char *format, int iTxCount)
{
int nr_of_chars=0;
while (iTxCount--)
{
COM_Printf(port, "[%02x]", (byte)*format++);
nr_of_chars++;
}
return (nr_of_chars);
}
/***********************************************************************/
/* NAME : TxBuffer */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
int COM_TxBuffer(int port, const char *buffer, int number_of_buffer)
{
int i = 0;
for (; i < number_of_buffer; i++)
{
COM_Putchar(port, *buffer++); /* Out Terminal */
}
return (i);
}
/***********************************************************************/
/* NAME : COM_DtrControl */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
void COM_DtrControl(int port, int ctrl)
{
word COMBASE;
switch (port)
{
case COM3: COMBASE = COM3BASE; break;
case COM4: COMBASE = COM4BASE; break;
}
if (ctrl == 1)
outp(COMBASE+MCR, 0x09|RTS); /* Set DTR ON */
else if (ctrl == 0)
outp(COMBASE+MCR, 0x08); /* Set DTR OFF */
}
/***********************************************************************/
/* NAME : COM_ClearBuffer */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
void COM_ClearBuffer(int port)
{
switch (port)
{
case COM1: RxIn1 = RxOut1 = 0x00; break;
case COM2: RxIn2 = RxOut2 = 0x00; break;
case COM3: SCC_ClearBuffer(0); break;
case COM4: SCC_ClearBuffer(1); break;
}
}
/***********************************************************************/
/* NAME : CheckPrinterBusy */
/* FUNCTION : */
/* ARGUMENT : */
/* RETURN VALUE : */
/***********************************************************************/
int CheckPrinterBusy(void)
{
byte status;
WR[15] |= DCD_IE;
SCC_write_command(0, WR15, WR[15]);
status = SCC_read_status(0, RR0);
COM_Printf(COM2, "S=[%02x]\r\n", status);
if (status & SCC_DCD)
return 1;
else
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -