⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 001.c

📁 适合于初期的学生看
💻 C
字号:
#include <stdio.h>
#include <dos.h>
#include <conio.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;
/*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);
	ucTemp=inportb(0x21)&0xef;
	outportb(0x21,ucTemp);
	setvect(0x0c,asyncint);
	enable();
    }




/*接受数据函数*/
unsigned char read_char(void) 

   {
	unsigned unch;
	if(buffout!=buffin)
	{ 
		unch=Buffer[buffout];
		buffout++;
		if(buffout>=BUFFLEN)
	         buffout=0;   
		printf("%c",unch);
		return(unch);
	}
	else
	    return(0xff);
   }


/* send char 发送字符函数 */

void send_char(unsigned char unch)

   {
   while ( ((inp( 0x3f8 + 5)) & 0x40 ) == 0); /*和0x40相与 可取出D6位进行判断*/ 
   outportb(0x3f8 , unch);
   }



/*中断函数*/
 void interrupt far asyncint()
   
    {
       Buffer[buffin++]=inport(0x3f8);/*读取字符到缓冲区*/
       if(buffin>=BUFFLEN)
          buffin=0;
         outportb(0x20,0x20);
    }



/*串口的初始化函数*/
void InitCOM() 
    {
     outportb(0x3fb,0x80);/*设置波特率4800bps*/
     outportb(0x3f8,0x18);
     outportb(0x3f9,0x00);
     outportb(0x3fb,0x0b);/*设置数据发送格式 8个数据位,一个停止位,无校验*/
     outportb(0x3fc,0x08|0x0b);/*设置modem*/
     outportb(0x3f9,0x01);/*设置中断允许 */
    }


 /*关闭串口函数*/
void ClosePort(void)  
     {
  	disable();
  	outportb(0x3f9,0x00);
  	outportb(0x3fc,0x00);
  	outportb(0x21,inportb((0x21)&0x10));
  	enable();
     	setvect(0x0c,asyncoldvect);
     }

/*以下为主函数*/

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*/
			}
			if(!bExit_Flag)
				send_char(unChar); /*发送键入的字符*/
		  }
		unChar = read_char();  /*从缓冲区中读数*/
		if (unChar != 0xff)
		     {
			fprintf(stdout,"%c",unChar);
		     }
	  } while (!bExit_Flag);
	  ClosePort(); /*关闭串口*/

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -