s1.inc
来自「Dos 串口通信例程实现了FiFO ,中断发送中断接受!」· INC 代码 · 共 639 行 · 第 1/2 页
INC
639 行
unsigned char rchar;
// rchar=inportb(Raddr);
// flag=1;
for (ff=0;ff<14;ff++) //连续接受14个字节数据并保存到缓冲区
// while((inportb(Raddr+5&0x01))==1)
{ rchar=inportb(Raddr);
if(++buffin==BUFFLEN) buffin=0;
if(buffin!=buffout)
Buffer[buffin]=rchar;}
flag=1;
outportb(0x20,0x20);
if(Rirq>=8)
outportb(0xA0,0x20);
}
/*********************************************************************************************
/该函数的主要功能是 关闭接受中断 恢复相关的中断向量
/其中各参数的意义为: addrn : 串口基地址 irqn : 中断号 rsier : 发送口或接受口的标志位
/********************************************************************************************/
void disableports(int addrn,int irqn){ // 关闭中断函数
int irqnx;
disable();
outportb(addrn+IER,0x00);
outportb(addrn+FCR,0x07);
outportb(addrn+FCR,0x00); //禁止FIFO
if(irqn<8){
outportb(0x21,inportb(0x21)&(0x01<<irqn));
irqnx=irqn+8;}
else{
outportb(0xA1,inportb(0xA1)&(0x01<<(irqn-8)));
irqnx=irqn+0x70-8;}
setvect(irqnx,old_vect);
enable();
}
/*******************************************************************************************
/该函数的主要功能为取接受缓冲区内的数据
/******************************************************************************************/
unsigned char getb(void){ //接受数据缓冲区
if(buffout!=buffin){
if(++buffout==BUFFLEN) buffout=0;
return(Buffer[buffout]);
}
else return(0xff);
}
/******************************************************************************************
/该函数的主要功能为取发送缓冲区内的数据
/******************************************************************************************/
unsigned char get(void){ //发送数据缓冲区
if(buffout!=buffin){
if(++buffout==BUFFLEN) buffout=0;
return(Out_Buffer[buffout]);
}
else return(0xff);
}
/*****************************************************************************************
/该函数的主要功能为 不使用FIFO方式下在显示区显示接受到的数据
/****************************************************************************************/
void prch(void){ //接受数据显示函数
if(flag==1){
window(3,3,46,10);
textbackground(3);
textcolor(14);
gotoxy(x1,y1); //返回接受显示区
ch=getb(); //取缓冲区数据
//if(ch==0xff)
// flag=0;
//else
cprintf("%c",ch);
if(ch==13) cprintf("\n");
flag=0;
x1=wherex();y1=wherey(); //记录当前光标值
window(3,14,46,22);
textbackground(3);
textcolor(15);
gotoxy(x2,y2); //返回发送显示区
}
}
/*****************************************************************************************
/该函数的主要功能为 使用FIFO方式下在显示区显示接受到的数据
/****************************************************************************************/
void Fprch(void){ //fifo方式下接受数据显示函数
if(flag==1){
window(3,3,46,10);
textbackground(3);
textcolor(14);
gotoxy(x1,y1);
for(ff=0;ff<14;ff++) //连续显示14个字节
{ ch=getb();
// if(ch==0xff)
// flag=0;
// else
cprintf("%c",ch);
if(ch==13) cprintf("\n");}
flag=0; //修改标志位
x1=wherex();y1=wherey();
window(3,14,46,22);
textbackground(3);
textcolor(15);
gotoxy(x2,y2);
}
}
/*****************************************************************************************
/该函数的主要功能为 窗口的全信号测试
/****************************************************************************************/
void testmodem(void){ //全信号测试函数
unsigned char mcr,mcs;
outportb(Raddr+3,0x1f);
outportb(Saddr+3,0x1f);
outportb(Raddr+4,0x03);
delay(10);
outportb(Raddr+4,0x00);
delay(10);
outportb(Raddr+4,0x03);
delay(2);
mcr=inportb(Saddr+6);
outportb(Raddr+4,0x00);
delay(2);
mcs=inportb(Saddr+6);
printf("Test end high %x and low %x.\n",mcr,mcs);
if(((mcr&0x11)==0x11)&&((mcs&0x11)==0x01))
printf("COM1 RTS-COM2 CTS is ok!\n");
else
printf("COM1 RTS-COM2 CTS is faulse!\n");
if(((mcr&0x22)==0x22)&&((mcs&0x22)==0x02))
printf("COM1 DTR-COM2 DSR is ok!\n");
else
printf("COM1 DTR-COM2 DSR is faulse!\n");
if(((mcr&0x44)==0x44)&&((mcs&0x44)==0x04))
printf("COM2 RI is ok!\n");
else
printf("COM2 RI is faulse!\n");
if(((mcr&0x88)==0x88)&&((mcs&0x88)==0x08))
printf("COM2 DCD is ok!\n");
else
printf("COM2 DCD is faulse!\n");
outportb(Saddr+4,0x03);
delay(10);
outportb(Saddr+4,0x00);
delay(10);
outportb(Saddr+4,0x03);
delay(2);
mcr=inportb(Raddr+6);
outportb(Saddr+4,0x00);
delay(2);
mcs=inportb(Raddr+6);
printf("Test end high %x and low %x.\n",mcr,mcs);
if(((mcr&0x11)==0x11)&&((mcs&0x11)==0x01))
printf("COM2 RTS-COM1 CTS is ok!\n");
else
printf("COM2 RTS-COM1 CTS is faulse!\n");
if(((mcr&0x22)==0x22)&&((mcs&0x22)==0x02))
printf("COM2 DTR-COM1 DSR is ok!\n");
else
printf("COM2 DTR-COM1 DSR is faulse!\n");
if(((mcr&0x44)==0x44)&&((mcs&0x44)==0x04))
printf("COM1 RI is ok!\n");
else
printf("COM1 RI is faulse!\n");
if(((mcr&0x88)==0x88)&&((mcs&0x88)==0x08))
printf("COM1 DCD is ok!\n");
else
printf("COM1 DCD is faulse!\n");
}
/*********************************************************************************************
/该函数的主要功能是 中断发送和中断接受方式下对通信的串口相关寄存器进行初始化: 设置波特率 数据位
/ 停止位 奇偶校验位 及初始化Moden控制寄存器
/其中各参数的意义为: addr : 串口基地址 bps : 波特率 rsier : 发送口或接受口的标志位
/ fcr :FIFO使能位 0x00 : 禁止 0xcf :开FIFO 门限值为 14
/ irq : 中断号
/********************************************************************************************/
void InitComPort(int addr, int irq, int bps, int rsier, int fcr){
int irqnx,vailable;
inportb(addr);
outportb(addr+LCR,0x80);
outport(addr,1843200/(16*bps));
vailable=Bit-5; //设置数据位 停止位 校验位
if(Stop==2)
vailable=vailable+4;
if(Parity==1)
vailable=vailable+8;
else if (Parity==2)
vailable=vailable+24;
outportb(addr+LCR,vailable);
outportb(addr+IER,rsier);
outportb(addr+FCR,fcr);
if(irq<8){
outportb(0x21,inportb(0x21)&(~(0x01<<irq)));
irqnx=irq+8;}
else{
outportb(0xA1,inportb(0xA1)&(~(0x01<<(irq-8))));
irqnx=irq+0x70-8;}
disable();
if((rsier&0x01)==1){ //receive //判断 发送 还是接受
outportb(addr+MCR,0x08&0x0B&0xFD);//RS485
receivevect=getvect(irqnx);
setvect(irqnx,receiveint);}
else{
outportb(addr+MCR,0x0a);
sendvect=getvect(irqnx);
setvect(irqnx,sendint);}
enable();
}
/*********************************************************************************************
/该函数的主要功能是 关闭发送和接受中断 恢复相关的中断向量
/其中各参数的意义为: addr : 串口基地址 irq : 中断号 rsier : 发送口或接受口的标志位
/********************************************************************************************/
void DisableComPort(int addr,int irq,int rsier)
{
int irqnx;
disable();
outportb(addr+IER,0x00);
outportb(addr+FCR,0x07);
outportb(addr+FCR,0x00); //禁止FIFO
if(irq<8)
{outportb(0x21,inportb(0x21)&(0x01<<irq));
irqnx=irq+8;
}
else{ outportb(0xa1,inportb(0xa1)&(0x01<<(irq-8)));
irqnx=irq+0x70-8;
}
if((rsier&0x01)==1)
setvect(irqnx,receivevect);
else setvect(irqnx,sendvect);
disable();
}
/*****************************************************************************************
/该函数的主要功能为 中断发送和中断接受方式下在显示区显示接受到的数据
/****************************************************************************************/
void prch2(void){ //中断发送下 的接受数据显示函数
if(flag==1){
window(3,3,46,10);
textbackground(3);
textcolor(14);
gotoxy(x1,y1);
do{
ch=getb();
flag--;
if(ch==13) cprintf("\n");
else cprintf("%c",ch);}while(flag!=0);
x1=wherex();y1=wherey();
window(3,14,46,22);
textbackground(3);
textcolor(15);
gotoxy(x2,y2);
}
}
/********************************************************************************************
/该函数的主要功能是中断发送方式下中断接受端口数据 并保存的接受数据缓冲区内
/********************************************************************************************/
void interrupt far receiveint(...){ //中断接受函数
unsigned char rchar,intflag;
intflag=inportb(Raddr+2);
if((intflag&0x06)==(2*2)){
rchar=inportb(Raddr);
flag++; //设置接受标志位
if(++buffin==BUFFLEN) buffin=0;
if(buffin!=buffout)
Buffer[buffin]=rchar;
}
outportb(0x20,0x20);
if(Rirq>=8)
outportb(0xA0,0x20);
}
/********************************************************************************************
/该函数的主要功能是中断发送方式下发送端口发送数据 并保存的发送数据缓冲区内
/********************************************************************************************/
void interrupt far sendint(...){ //中断发送函数
unsigned char schar;
schar=str[k++];
if(k>78) k=0;
outportb(Saddr,schar);
sendflag=1; //设置发送标志位
if(++buffin==BUFFLEN) buffin=0;
if(buffin!=buffout)
Out_Buffer[buffin]=schar;
outportb(0x20,0x20);
if(Sirq>=8)
outportb(0xA0,0x20);
delay(5);
}
/*****************************************************************************************
/该函数的主要功能为 中断发送和中断接受方式下在显示区显示已发送的数据
/****************************************************************************************/
void sendprch(void){ //中断发送显示函数
if(sendflag==1)
{ch=get();
sendflag=0;
cprintf("%c",ch);
if(ch==13) cprintf("\n");
x2=wherex();y2=wherey();
}
}
/*********************************************************************************************
/该函数的主要功能是 关闭发送和接受中断
/其中各参数的意义为: addrn : 串口基地址 irqn : 中断号
/********************************************************************************************/
void rsdisableport(int addrn,int irqn){ //关闭接受和发送中断
disable();
outportb(addrn+IER,0x00);
if(irqn<8){
outportb(0x21,inportb(0x21)&(0x01<<irqn));
}
else{
outportb(0xA1,inportb(0xA1)&(0x01<<(irqn-8)));
}
enable();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?