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<