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 + -
显示快捷键?