www.gusucode.com > Visual C++_Turbo C串口通信编程实践(第2版)配套光盘 > Visual C++_Turbo C串口通信编程实践(第2版)配套光盘/Visual C++_TurboC串口通信编程实践(第2版)光盘/第01章/0103/comrx.cpp
///////////////////////////////////////////////////////////// //COMRX.CPP for asyn serial communication (only RX) //edited by Xiong Guangming and Gong Jianwei //Turbo C++3.0 ///////////////////////////////////////////////////////////// #include <stdio.h> #include <dos.h> #include <conio.h> #define BUFFLEN 1024 void InitCOM(); //初始化串口 void OpenPort(); //打开串口 void ClosePort(); //关闭串口,释放串口资源 //新的中断函数,注意在TC2.0下,下面函数的...要去掉 void interrupt far asyncint(...); //中断向量:用于保存中断现场 void interrupt(*asyncoldvect)(...); unsigned char Buffer[BUFFLEN]; int buffin=0; int buffout=0; //unsigned char ch; //COM1产生的硬件中断号为IQR4,对应的中断向量为为0CH //打开COM1 void OpenPort() { unsigned char ucTemp; InitCOM(); //初始化串口 //读入由参数给定的中断向量值,并将它作为中断函数的远地址 asyncoldvect=getvect(0x0c); disable(); //关中断 inportb(0x3f8); inportb(0x3fe); inportb(0x3fb); inportb(0x3fa); outportb(0x3fc,0x08|0x0b); outportb(0x3f9,0x01); ucTemp=inportb(0x21)&0xef; outportb(0x21,ucTemp); setvect(0x0c,asyncint); enable(); //开中断 } //中断服务程序,从COM1接收数据 //注意在TC2.0下,下面函数的...要去掉 void interrupt far asyncint(...) { //unsigned char ch; Buffer[buffin++] = inportb(0x3f8);// 读字符到缓冲区 if (buffin >= BUFFLEN) // 缓冲区满 buffin=0; // 指针复位 outportb(0x20,0x20); } void ClosePort(void) //关闭中断 { disable(); outportb(0x3f9,0x00); outportb(0x3fc,0x00); outportb(0x21,inportb(0x21)&0x10); enable(); setvect(0x0c,asyncoldvect); } void InitCOM()// 对COM1串口初始化,设置串口参数 { outportb(0x3fb,0x80); //将设置波特率 /* 设置波特率,低位在前、高位在后;(部分波特率器参数如下) 波特率 分频器H 分频器L ... 4800 00 18H 7200 00 10H 9600 00 0CH .... */ outportb(0x3f8,0x0C); //波特率为9600bps outportb(0x3f9,0x00); /*设置停止位、奇偶校验位、等 D7:为1表示设置波特率;为0,其他; D6:为1,是,强迫在数据线上输出逻辑0;为0,则否; D5:1,校验位可变;0,不变; D4D3:×0,无校验位;01,奇校验位;11,偶校验位; D2:0,1个停止位;1,1.5个停止位; D1D0:00,5位数据位;01,6位数据位;10,7位数据位;11,8位数据位; */ outportb(0x3fb,0x03); //8个数据位,1个停止位、无奇偶校验 outportb(0x3fc,0x08|0x0b); outportb(0x3f9,0x01); } unsigned char read_char(void) { unsigned unch; if(buffout != buffin) { unch = Buffer[buffout]; buffout++; if(buffout >= BUFFLEN) buffout=0; return(unch); } else return(0xff); } //以下为主函数 void main() { unsigned char unChar; short bExit_Flag=0; OpenPort(); //打开串口 fprintf(stdout, "\n\nReady to Receive DATA\n" "press [ESC] to quit...\n\n"); do { if (kbhit()) { unChar=getch(); /* Look for an ESC key */ switch (unChar) { case 0x1B: //ESC的ASCII值为27 bExit_Flag = 1; /* Exit program */ break; //You may want to handle other keys here } } unChar = read_char(); //从缓冲区中读数 if (unChar != 0xff) { fprintf(stdout,"%c",unChar); } } while (!bExit_Flag); ClosePort(); //关闭串口 }