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

📄 serport.c

📁 DOS环境下Turbo C串口通信编程
💻 C
字号:
/////////////////////////////////////////////////////////////

//COMRX.CPP  for asyn serial communication (only RX)

//edited by Xiong Guangming and Gong Jianwei 

//Turbo C++3.0

/////////////////////////////////////////////////////////////

#include <stdio.h>

#include <dos.h>

#include <conio.h>

#define BUFFLEN 1024

void InitCOM();  //初始化串口

void OpenPort();  //打开串口

void ClosePort(); //关闭串口,释放串口资源

//新的中断函数,注意在TC2.0下,下面函数的...要去掉

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);
	outportb(0x3f9,0x01);
	ucTemp=inportb(0x21)&0xef;
	outportb(0x21,ucTemp); 
	setvect(0x0c,asyncint);
	enable();        //开中断  	
}

void interrupt far asyncint( )
{//unsigned char ch;
   Buffer[buffin++] = inportb(0x3f8);//读字符到缓冲区
   if(buffin >=BUFFLEN)//缓冲区满
     buffin=0;		   //指针复位
	outportb(0x20,0x20);
	}

void ClosePort(void) //关闭中断
{disable();
 outportb(0x3f9,0x00);
 outportb(0x3fc,0x00);
 outportb(0x21,inportb(0x21)&0x10);
 enable();
 setvect(0x0c,asyncoldvect);
 }

void InitCOM()	 //对COM1串口初始化,设置串口参数
{outportb(0x3fb,0x80);	 //将设置波特率
 outportb(0x3f8,0x0c);	 //波特率为9600bps
 outportb(0x3f9,0x00);
 outportb(0x3fb,0x03);   //8个数据位,1个停止位,无奇偶校验位
 outportb(0x3fc,0x08|0x0b);
 outportb(0x3f9,0x01);
 }

unsigned char read_char(void)
{	unsigned unch;
	if(buffout != buffin)
	{
		unch = Buffer[buffout];
		buffout++;
		if(buffout >= BUFFLEN)
			buffout=0;
		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 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 + -