#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();}
#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();}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货