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

📄 st1.c

📁 TC下的C语言串口编程。以用于实际工程
💻 C
字号:
#include <bios.h>
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <process.h>
#include <malloc.h>


#define IBUFFLEN  4096
#define OBUFFLEN  4096
#define SERIAL    0xEF

void InitCOM(void);
void OpenCOM(void);
void CloseCOM(void);
void interrupt asyncint();
void interrupt (*asyncoldvect)();

int fComInited=0;
int fBusyCom=0;

unsigned char ModeStatus=0;
unsigned char LineStatus=0;

unsigned char IBuffer[IBUFFLEN];
unsigned short rpI=0;
unsigned short wpI=0;

unsigned char OBuffer[OBUFFLEN];
unsigned short rpO=0;
unsigned short wpO=0;

int read_char(void);
void send_char (unsigned int unCh);

/*void InitialPort()*/
void InitCOM()
{
outportb(0x3FB,0x80);        /****线路控制寄存器LCR***/
outportb(0x3F8,0x01);        /*******baud 9600********/
outportb(0x3F9,0x00);
outportb(0x3FB,0x03);        /****帧格式:1位停止位,8位数据位,无校验位****/
//outportb(0x3FC,0x1f);
outportb(0x3FC,0x08);
//outportb(0x3FC,0x18|0x1b); /****MODEM控制寄存器****/
//outportb(0x3F9,0x0f);        /**允许接收中断***/
outportb(0x3F9,0x03);
}

void OpenCOM()
{
unsigned char ucTemp,ch;
if(fComInited)
return;
fComInited=1;
disable();//关中断xin
InitCOM();
asyncoldvect=getvect(0x0c);  //保存原串行口中断服务程序地址
//disable();//关中断
outportb(0x3f8,0x00);//clear send interrupt
inportb(0x3f8);
inportb(0x3fe);
inportb(0x3fb);
inportb(0x3fa);
//outportb(0x3fc,0x08|0x0b);//
//outportb(0x3f9,0x01);       //

ucTemp=inportb(0x21)&SERIAL;//,读中断屏蔽寄存器,允许串口1中断(COM1中断在8259中是4号中断)
outportb(0x21,ucTemp);
setvect(0x0c,asyncint);    //设置新串行口中断服务程序地址
enable();
}


void CloseCOM(void)
{
 if(fComInited==0)
 return;
 fComInited=0;
 disable();
 outportb(0x3f9,0x00);
 outportb(0x3fc,0x00);
 outportb(0x21,inportb(0x21)&~SERIAL);//串口中断被屏蔽
 enable();
 setvect(0x0c,asyncoldvect);
}

void interrupt asyncint()
{
  int temp;
  while(((temp=inportb(0x3fa))&0x01)==0)
  {
	switch(temp&0x0f)
	{
	 case 0:    ModeStatus=inportb(0x3fe);
					break;
	 case 2:    //send data
					if(fBusyCom==0)
					 break;
					if(rpO==wpO)
					{
					 fBusyCom=0;
					 break;
					}
					outportb(0x3f8,OBuffer[rpO++]);
					rpO%=OBUFFLEN;
					break;
	 case 4:    //receive data
					IBuffer[wpI++]=inportb(0x3f8);
					if(wpI==(rpI?rpI:IBUFFLEN))
					  wpI--;
					else
					 wpI%=IBUFFLEN;
					break;
	 case 6:
					LineStatus=inportb(0x3fd);
					break;
	}
  }
  outportb(0x20,0x20);
}

int read_char(void)
{
 int temp;
 if(rpI==wpI)
 return -1;
 temp=IBuffer[rpI];
 rpI=(rpI+1)%IBUFFLEN;
 return temp;
}

void send_char (unsigned int unCh)
{
 disable();
 if(fBusyCom)
 {
  OBuffer[wpO++]=unCh;
  if(wpO==(rpO?rpO:OBUFFLEN))
  {
	wpO--;
  }
  else
	wpO%=OBUFFLEN;
 }
 else
 outportb(0x3f8,unCh);
 fBusyCom=1;
 enable();
}

void main()                            /********主函数*********/
{
	int unch;
	unsigned char data;
	short bExit_Flag=0;
    
	OpenCOM();
	fprintf(stdout,"\n\nReady to Receive DATA\n""press [ESC] to quit ...\n\n");

	do
	{
	  if(kbhit())
	  {
	  unch=getch();

		 switch(unch)
		{
		case 0x1b: bExit_Flag=1;
					  break;
					  default :break;
		}
		if(!bExit_Flag)
		send_char(unch);
	  }

	  unch=read_char();

	  if(unch!=-1)
	  {
	      printf("%c",unch);
	  }
	}
		while(!bExit_Flag);
		CloseCOM();
}

⌨️ 快捷键说明

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