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

📄 main.cpp

📁 在DOS下非常好用的串口类
💻 CPP
字号:
#include "GSerial.h"

struct COMPORT_VAR{
	char  inbuf[IBUF_LEN];		// in buffer
	char  outbuf[OBUF_LEN];		// out buffer

	unsigned int   startbuf ;
	unsigned int   endbuf  ;
	unsigned int   inhead  ;
	unsigned int   intail   ;
	unsigned int   outhead  ;
	unsigned int   outtail  ;
	unsigned int   PortBase ;
};
COMPORT_VAR comport1,comport2;

extern unsigned int PortBaseAddr[6];
unsigned char buff[256];
int i=0;
int flag=0;
// 70-8  71-9  72-10  73-11  74-12  75-13 76-14 77-15
extern int InterruptNo[6];
extern int ComIRQ[6];
void interrupt ComIntServ_comport1(...)
{
	int temp;
	disable();
	temp = (inportb(comport1.PortBase+IIR)) & IIR_MASK;				// why interrupt was called
	switch(temp)
	{
		case 0x00:  // modem status changed
			inportb(comport1.PortBase+MSR);   // read in useless char
			break;
		case 0x02:  // Request To Send char
			if (comport1.outhead != comport1.outtail)							// there's a char to send
			{
				outportb(comport1.PortBase+TXR,comport1.outbuf[comport1.outhead++]);	// send the character
				if (comport1.outhead == OBUF_LEN)
					comport1.outhead=0;								// if at end of buffer, reset pointer
			}
			break;
		case 0x04:  // character ready to be read in
			//inbuf[inhead++] = inportb(m_unPortBase+RXR);// read character into inbuffer
			comport1.inbuf[comport1.inhead] = inportb(comport1.PortBase+RXR);// read character into inbuffer
			comport1.inhead++;
			if (comport1.inhead == IBUF_LEN) // if at end of buffer
				comport1.inhead=0;           // reset pointer
			break;
		case 0x06:  // line status has changed
			inportb(comport1.PortBase+LSR);     // read in useless char
			break;
		default:
			break;

	}

	outportb(PIC8259_ICR, PIC8259_EOI);	// Signal end of hardware interrupt
	enable();							// reenable interrupts at the end of the handler

}


//COM1 串口1
char ReadChar_comport1(void)
{
	char ch;
	if (comport1.inhead != comport1.intail)     // there is a character
	{
		disable();                          // disable irqs while getting char
		ch = comport1.inbuf[comport1.intail++];               // get character from buffer
		if (comport1.intail == IBUF_LEN)				// if at end of in buffer
			comport1.intail=0;						// reset pointer
		enable();                           // re-enable interrupt
		return(ch);                      // return the char
	}
	ch = -1;
	return(ch);                          // return nothing
}


////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////COM2//////////////////////////////////////////////////////////

void interrupt ComIntServ_comport2(...)
{
	int temp;
	unsigned char ch;
	disable();
	temp = (inportb(comport2.PortBase+IIR)) & IIR_MASK;				// why interrupt was called
	switch(temp)
	{
		case 0x00:  // modem status changed
			inportb(comport2.PortBase+MSR);   // read in useless char
			break;
		case 0x02:  // Request To Send char
			if (comport2.outhead != comport2.outtail)							// there's a char to send
			{
				outportb(comport2.PortBase+TXR,comport2.outbuf[comport2.outhead++]);	// send the character
				if (comport2.outhead == OBUF_LEN)
					comport2.outhead=0;								// if at end of buffer, reset pointer
			}
			break;
		case 0x04:  // character ready to be read in
			//inbuf[inhead++] = inportb(m_unPortBase+RXR);// read character into inbuffer
		  /*	comport2.inbuf[comport2.inhead] = inportb(comport2.PortBase+RXR);// read character into inbuffer
			comport2.inhead++;
			if (comport2.inhead == IBUF_LEN) // if at end of buffer
				comport2.inhead=0;*/
			ch=inportb(comport2.PortBase+RXR);
			buff[i++]=ch;
			flag=1;
		       //	printf("%x ",buff[i-1]);
			if(i>=265)
			i=0;
			break;
		      //printf("%x ",ch);		   // reset pointer

		case 0x06:  // line status has changed
			inportb(comport2.PortBase+LSR);     // read in useless char
			break;
		default:
			break;

	}

	outportb(PIC8259_ICR, PIC8259_EOI);	// Signal end of hardware interrupt
	enable();							// reenable interrupts at the end of the handler

}


//COM2 串口2
char ReadChar_comport2(void)
{
	char ch;
	if (comport2.inhead != comport2.intail)     // there is a character
	{
		disable();                          // disable irqs while getting char
		ch = comport2.inbuf[comport2.intail++];               // get character from buffer
		if (comport2.intail == IBUF_LEN)				// if at end of in buffer
			comport2.intail=0;						// reset pointer
		enable();                           // re-enable interrupt
		return(ch);                      // return the char
	}
	ch = -1;
	return(ch);                          // return nothing
}

///////
main()
{
	/* Communications parameters */

	comport1.startbuf =0;
	comport1.endbuf   =0;
	comport1.inhead   =0;
	comport1.intail   =0;
	comport1.outhead  =0;
	comport1.outtail  =0;
	comport1.PortBase =0;

	comport2.startbuf =0;
	comport2.endbuf   =0;
	comport2.inhead   =0;
	comport2.intail   =0;
	comport2.outhead  =0;
	comport2.outtail  =0;
	comport2.PortBase =0;


	int   port     = COM1;
	int   speed    = 9600;
	int   parity   = LCR_NO_PARITY;
	int   bits     = 8;
	int   stopbits = 1;
	int   done  = FALSE;
	char  c;
	int  temp;
	int  SError=0;

	GSerial gsCOM2;  //定义两个GSerial对象

	//初始化COM1,串口1
	/*if (!gsCOM1.InitSerialPort(port, speed, parity, bits, stopbits))
	{
		comport1.PortBase = PortBaseAddr[port-1];
		gsCOM1.SetVects(ComIntServ_comport1);
		gsCOM1.CommOn();
	}
	else
	   SError=2;*/

	//初始化COM2,串口2
	port  =  COM2;
	if (!gsCOM2.InitSerialPort(port, speed, parity, bits, stopbits))
	{
		comport2.PortBase = PortBaseAddr[port-1];
		gsCOM2.SetVects(ComIntServ_comport2);
		gsCOM2.CommOn();
	}
	else
	   SError=2;


	//打印串口地址及中断向量地址
	//printf("\nCOM%d, PortBase=0X%x, IntVect=0X%x\n\n",
	  //	gsCOM1.m_unPortNo,gsCOM1.m_unPortBase,ComIRQ[gsCOM1.m_unPortNo-1]);

	printf("\nCOM%d, PortBase=0X%x, IntVect=0X%x\n\n",
		gsCOM2.m_unPortNo,gsCOM2.m_unPortBase,ComIRQ[gsCOM2.m_unPortNo-1]);

	printf("Now we are ready to go: \n\n");



	do {
	 /*char ch;
		 ch='s';
		 //gsCOM1.SendChar(ch);
		 //delay(500);
		 ch=ReadChar_comport2();
		 if(ch!=-1)
		 printf("%x ",ch);*/
		 if(flag==1)
		 {
		 printf("%x ",buff[i-1]);
		 flag=0;
		 }
		if (kbhit())
		{
			c = getch();
			// Look for an Escape key
			switch (c)
			{
				case ESC:
					done = TRUE;  // Exit program
					break;
			}
		     /*	if (!done)
			{
			   gsCOM1.SendChar( c );
			   fprintf(stdout,"\n\n[COM1:TX]: %c\n",c);
			}*/
		}
		/*
		c = ReadChar_comport1();
		if (c != -1)     //'-1' is the END signal of a string
		{
			fprintf(stdout,"[COM1:RX]: %c\n",c);
		}

		delay(50);

		c = ReadChar_comport2();
		if (c != -1)     //'-1' is the END signal of a string
		{
			fprintf(stdout,"[COM2:RX]:  %c\n",c);
			gsCOM2.SendChar( c );
			fprintf(stdout,"[COM2:TX]:  %c\n",c);
		}*/

	} while ((!done) && (!SError));

	//关闭打开的串口
       //	gsCOM1.CloseSerialPort();
	gsCOM2.CloseSerialPort();

	/* Check for errors */
	switch (SError)
	{
		case NO_ERROR: printf("\nbye.\n");
					  return (0);

		case BUF_OVFL: printf("\nBuffer Overflow.\n");
					  return (99);
		case 2:   printf("\n Cannot init serial port");
					   return(2);
		default:      printf("\nUnknown Error, SError = %d\n",
							  SError);
					  return (99);
	}
}



⌨️ 快捷键说明

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