#include <stdio.h>
#include <conio.h>
#include <dos.h>#define BUFFLEN  1024   void InitCom();
void OpenPort();
void ClosePort();
void interrupt far asyncint();
void interrupt  (*asyncoldvect)();
unsigned  char  Buffer[BUFFLEN];int buffin=0;
int buffout=0;/*中断服务程序,从COM1接收数据 */
void interrupt far asyncint()
{
    Buffer[buffin++]=inportb(0x3f8);  /*读取0x3f8中的数据缓冲区*/
    if(buffin>=BUFFLEN)             /*缓冲区满                       */    buffin=0;  /*指针复位*/    outportb(0x20,0x20);  /*向主片发送EOI命令*/
}
void OpenPort()
{
    unsigned  char  uctemp;
    InitCom();    /*初始化COM1端口*/
    asyncoldvect=getvect(0x0c);    /* 将中断向量地址0x0c保存   COM1产生的硬件中断号为IQR4,对应的中断向量是0x0c    */
    disable();      /*屏蔽中断*/
    inportb(0x3f8);??????? 为什么要写 以下4个inportb  /*读发送数据寄存器    */
    inportb(0x3fe);   /*读MODEM状态寄存器  */
    inportb(0x3fb);   /*读线路控制寄存器   */
    inportb(0x3fa);   /*读中断标识寄存器  */
    outportb(0x3fc,0x08|0x0b);   (0x08|0x0b)这个是什么意思,怎么来的 /*0x3fc为MODEM控制寄存器 ,将00000000写入*/    outportb(0x3f9,0x01);     /*将00000001写入0x3f9(当低3位(A2,A1,A0)为001时为中断允许寄存器)*/    uctemp=inportb(0x21)&0xef;    outportb(0x21,uctemp);    /*打开主片IRQ4*/    setvect(0x0c,asyncint);
    enable();  /*打开中断*/}void ClosePort(void)
{
    disable();
    outportb(0x3f9,0x00); /* 中断允许寄存器*/
    outportb(0x3fc,0x00);
    outportb(0x21,inportb(0x21)&0x10); /*关闭主片IRQ4*/
    enable();
    setvect(0x0c,asyncoldvect);
}
void InitCom()
{
    outportb(0x3fb,0x80);     /* 0x80=10000000写入0x3fb,  作用是将D7(DLAB)置1,当D7为1时是除数锁存器,为0是接受/发送寄存器        */    outportb(0x3f8,0x0c);     /*将0x0c=****1100写入锁存器低位       */    outportb(0x3f9,0x00);     /*0x00=0000****就写入锁存器高位                  设置比特率为:9600bps */    outportb(0x3fb,0x03);    /*设置无奇偶效验,停止位为一位,8位数据位。将00000011写入0x3fb,当低3位(A2,A1,A0)为011时,寄存器为线路控制寄存器,        */    outportb(0x3fc,0x80|0x0b);       /*  ?0x3fc为MODEM控制寄存器 ,将00000000写入*/    outportb(0x3f9,0x01);     /*将00000001写入0x3f9(当低3位(A2,A1,A0)为001时为中断允许寄存器)*/
}
unsigned char read_char(void)
{
    unsigned char unch;    if(buffout!=buffin)
    {
        unch=Buffer[buffout];
        buffout++;        if(buffout>=BUFFLEN)
        buffout=0;        return (unch);     }     else
     return (0xff);
}/*void send_char(unsigned  char unch)
{
    if((inp(0x3f8+5))&0x40==0)
      outportb(0x3f8,unch);} */
void main()
{
    unsigned char unchar;
    short int bExit_Flag=0; /*bExit_Flag==1是,退出 */
    OpenPort();   /*打开断口 */   fprintf(stdout,"\n\nReady to Receive DATA\n"
                   "Press[Esc] to quit...\n\n");
     do
     {
        if(kbhit())
        {
            unchar=getch();            switch(unchar)
            {                case 0x1b:                bExit_Flag=1;
                break;             }          /* if(bExit_Flag!=1)
             send_char(unchar); */         }           unchar=read_char();           if(unchar!=0xff);
           {
                fprintf(stdout,"%c",unchar);            }
        }while(!bExit_Flag);       ClosePort();}