#define Com1Base 0x3f8 //定义串口com1的基地址;
#define Com2Base 0x2f8 //定义串口com2的基地址;
void main()
{
int st,fp,jp,op;
int d=0;
outportb(Com2Base+3,0x80); //允许访问com2的波特率因子寄存器,禁止串口中断,无校验,无停止位;
outportb(Com2Base+0,0x0c); //设置com2的波特率低八位;
outportb(Com2Base+1,0x00); //设置com2的波特率高八位;
outportb(Com2Base+3,0x03); //禁止访问com2口的波特率因子寄存器,禁止串口中断,无校验,无停止位,八位数据;
outportb(Com2Base+4,0); //初始化串口com2的MODEM寄存器;
outportb(Com2Base+1,0); //初始化com2的中断允许寄存器,屏蔽串口com2
的中断;
outportb(Com1Base+3,0x80); //允许访问com1的波特率因子寄存器,禁止串口中断,无校验,无停止位;
outportb(Com1Base+0,0x0c); //设置com1的波特率低八位;
outportb(Com1Base+1,0x00); //设置com2的波特率高八位;
outportb(Com1Base+3,0x03); 禁止访问com2口的波特率因子寄存器,禁止串口中断,无校验,无停止位,八位数据;
outportb(Com1Base+4,0); //初始化串口com2的MODEM寄存器;
outportb(Com1Base+1,0); //初始化com2的中断允许寄存器,屏蔽串口com2
的中断;
printf("please transfer a character to com2:/n");
do{
do{
st=inportb(Com2Base+5);
printf("%x/n",st);
}while(st&0x20!=0x20); //查询com2的线路状态寄存器(LSR)的第五位
的状态是否为1,即发送保持寄存器是否为空?也就是com2口是否准备好发送数据;若否则循环等待;
while(1)
{
printf("%x/n",d+1);
outportb(Com2Base,++d); //从com2口发送数据;
do{
fp=inportb(Com2Base+5);
}while((fp&0x20)!=0x20); //查询等待com2的线路状态寄存器(LSR)的第五位的状态是否为1,即发送保持寄存器是否为空?若否则循环等待;
break; //com2的线路状态寄存器(LSR)的第五位的状态是否为1,即发送保持寄存器为空,跳出数据发送程序。
}
printf("display the character while was just received from com1/n");
do
{
jp=inportb(Com1Base+5);
}while((jp&0x01)!=1); //查询等待com1的线路状态寄存器(LSR)的第五位的状态是否为1,即发送保持寄存器是否为空?若否则循环等待;
printf("%x/n",inportb(Com1Base+0)); //com1口读入数据,并在屏幕上显示出来;
do
{
op=inportb(Com1Base+5);
}while((op&0x01)!=0); //查询等待com1的线路状态寄存器(LSR)的第五位的状态是否为1,即发送保持寄存器是否为空?若否则循环等待;
delay(10000); //延时;
}while(!kbhit()); //敲任意键退出程序;
}
#define Com2Base 0x2f8 //定义串口com2的基地址;
void main()
{
int st,fp,jp,op;
int d=0;
outportb(Com2Base+3,0x80); //允许访问com2的波特率因子寄存器,禁止串口中断,无校验,无停止位;
outportb(Com2Base+0,0x0c); //设置com2的波特率低八位;
outportb(Com2Base+1,0x00); //设置com2的波特率高八位;
outportb(Com2Base+3,0x03); //禁止访问com2口的波特率因子寄存器,禁止串口中断,无校验,无停止位,八位数据;
outportb(Com2Base+4,0); //初始化串口com2的MODEM寄存器;
outportb(Com2Base+1,0); //初始化com2的中断允许寄存器,屏蔽串口com2
的中断;
outportb(Com1Base+3,0x80); //允许访问com1的波特率因子寄存器,禁止串口中断,无校验,无停止位;
outportb(Com1Base+0,0x0c); //设置com1的波特率低八位;
outportb(Com1Base+1,0x00); //设置com2的波特率高八位;
outportb(Com1Base+3,0x03); 禁止访问com2口的波特率因子寄存器,禁止串口中断,无校验,无停止位,八位数据;
outportb(Com1Base+4,0); //初始化串口com2的MODEM寄存器;
outportb(Com1Base+1,0); //初始化com2的中断允许寄存器,屏蔽串口com2
的中断;
printf("please transfer a character to com2:/n");
do{
do{
st=inportb(Com2Base+5);
printf("%x/n",st);
}while(st&0x20!=0x20); //查询com2的线路状态寄存器(LSR)的第五位
的状态是否为1,即发送保持寄存器是否为空?也就是com2口是否准备好发送数据;若否则循环等待;
while(1)
{
printf("%x/n",d+1);
outportb(Com2Base,++d); //从com2口发送数据;
do{
fp=inportb(Com2Base+5);
}while((fp&0x20)!=0x20); //查询等待com2的线路状态寄存器(LSR)的第五位的状态是否为1,即发送保持寄存器是否为空?若否则循环等待;
break; //com2的线路状态寄存器(LSR)的第五位的状态是否为1,即发送保持寄存器为空,跳出数据发送程序。
}
printf("display the character while was just received from com1/n");
do
{
jp=inportb(Com1Base+5);
}while((jp&0x01)!=1); //查询等待com1的线路状态寄存器(LSR)的第五位的状态是否为1,即发送保持寄存器是否为空?若否则循环等待;
printf("%x/n",inportb(Com1Base+0)); //com1口读入数据,并在屏幕上显示出来;
do
{
op=inportb(Com1Base+5);
}while((op&0x01)!=0); //查询等待com1的线路状态寄存器(LSR)的第五位的状态是否为1,即发送保持寄存器是否为空?若否则循环等待;
delay(10000); //延时;
}while(!kbhit()); //敲任意键退出程序;
}
本文介绍了如何使用C语言进行COM1和COM2串口的配置,包括设置波特率、禁止中断、无校验和无停止位。通过inportb和outportb函数进行端口操作,实现数据的发送和接收,通过查询线路状态寄存器(LSR)确保数据传输的正确完成。
5465

被折叠的 条评论
为什么被折叠?



