www.pudn.com > Doscom.rar > Doscom.C
#include/*#include */ #include #include #include #include #include #define RXD 0 #define TXD 0 /*发送 */ #define LSB 0 /*波特率调节低8位*/ #define MSB 1 /*波特率调节高8位 */ #define IER 1 /* 中断起用寄存器*/ #define IIR 2 /*中断标识寄存器*/ #define LCR 3 /*线路控制寄存器 */ #define MCR 4 /*调制解调器控制寄存器 */ #define LSR 5 /*线路状态寄存器 */ #define MSR 6 /*调制解调器状态寄存器 */ #define IERV 1 #define OUT2 0x08 #define ERTS 2 #define EDTR 1 #define EMPTY 0X20 #define READY 0X30 #define ICREG 0X20 #define IMASKREG 0X21 #define EOI 0X20 #define WAITCOUNT 5000 #define BUFFLEN 2048 /*用于存储字符的数组的界*/ #define ALTE 0X12 #define ALTQ 0X10 #define SER_BAUD_1200 96 #define SER_BAUD_2400 48 #define SER_BAUD_9600 0x0C #define SER_BAUD_19200 6 #define SER_BAUD_115200 1 #define SER_STOP_1 0 /*/ 1 stop bit per character*/ #define SER_STOP_2 4 /*/ 2 stop bits per character*/ #define SER_BITS_5 0 /*/ send 5 bit characters*/ #define SER_BITS_6 1 /*/ send 6 bit characters*/ #define SER_BITS_7 2 /*/ send 7 bit characters*/ #define SER_BITS_8 3 /*/ send 8 bit characters*/ #define SER_PARITY_NONE 0 /*/ no parity*/ #define SER_PARITY_ODD 8 /*/ odd parity*/ #define SER_PARITY_EVEN 24 /*/ even parity*/ int port; int ComNum; unsigned portaddr; unsigned portf; unsigned int baudtable[]={0x180,0xc0,0x60,0x30,0x18,0x0c,0x06,0x01}; unsigned char paritytable[]={0x08,0x18,0x00,0x28,0x38}; unsigned char buffer[1024];/*recv buf*/ int buffin=0; int buffout=0; int incount=0; int outcount=0; void interrupt(*vect_com)(); void putb(unsigned char ch)/*write a char to the recvbuf 将中断得到的数据写到缓冲区*/ { int temp; temp=buffin; if(++buffin==BUFFLEN) buffin=0; if(buffin!=buffout) {buffer[buffin]=ch; /* printf("bufferin[%d]=%c",buffer[buffin]); getch(); */ } else buffin=temp; }; unsigned char getb()/*read a char from the recvbuf*/ { if(buffout!=buffin) { if(++buffout==BUFFLEN) buffout=0; /*printf("bufferout[%d]=%c",buffout,buffer[buffout]);*/ return(buffer[buffout]); } else return(0xff); }; /*unsigned char sender( unsigned char ch) { outportb(portaddr2+TXD,ch); printf("\nsender outportdata=%c\n",ch); outcount++; return(1); }; */ void interrupt receiver( ) { unsigned char ch; ch=inportb(portaddr+RXD); putb(ch); incount++; /*记录接收了多少个数据。*/ outportb(ICREG,EOI); }; void SerInit(int baud,int configuration) { disable(); outportb(portaddr+LCR,0x80); outportb(portaddr+LSB,baud); outportb(portaddr+MSB,0x00); outportb(portaddr+LCR,configuration); enable(); }; void SerOpen(void) { vect_com=getvect(portf+8); disable(); inportb(portaddr+RXD); inportb(portaddr+MSR); inportb(portaddr+LSR); inportb(portaddr+IIR); outportb(portaddr+IER,IERV); outportb(portaddr+MCR,OUT2|ERTS|EDTR); outportb(IMASKREG,inportb(IMASKREG)&(~(1<