亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gserial.cpp

?? 串口編程源代碼.rar
?? CPP
字號:

  /*------------------------------------------------------------------*
	  GSERIAL.CPP 
	  Edited by Gong jianwei  http://www.gjwtech.com
	  For asynchronous serial port communications
	  適用于DOS環境下異步串口通信編程 多串口控制程序 
      ATTENTION: Compile this program with Test Stack Overflow OFF.
	在Turbo C++3.0中選項設置 Options/Compiler/Entry中關閉Test Stack Overflow

  *------------------------------------------------------------------*/

#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;




//////////////////////////////////GSerial////////
GSerial::GSerial()
{
}

GSerial::~GSerial()
{
}

//*  get status of the port  */
int GSerial::ReadStatus(void)
{
  return(inp(m_unPortBase+5));
}

/*  send one valid char from the port  */
void GSerial::SendChar(unsigned char unCh)
{
   while ((ReadStatus() & 0x40) == 0);
   outportb(m_unPortBase,unCh);
}

/*  send one string from the port  */
void GSerial::SendString(int nStrlen, unsigned char *unChBuf)
{
	int k=0;	
	do {
		SendChar(*(unChBuf + k));	
		k++;
	} while ((k < nStrlen));
}


/* Install our functions to handle communications */
void GSerial::SetVects(void interrupt(*New_Int)(...))
{
	disable();
	OldVects = getvect(InterruptNo[m_unPortNo-1]);
	setvect(InterruptNo[m_unPortNo-1], New_Int);
	enable();
}

/* Uninstall our vectors before exiting the program */
void GSerial::ResetVects(void)
{
	setvect(InterruptNo[m_unPortNo-1], OldVects);
}



/* Tell modem that we're ready to go */
void GSerial::CommOn(void)
{
	int temp;
	disable();
	//temp = inportb(m_unPortBase + MCR) | MCR_INT;
	//outportb(m_unPortBase + MCR, temp);
	outportb(m_unPortBase + MCR, MCR_INT);
	//temp = inportb(m_unPortBase + MCR) | MCR_DTR | MCR_RTS;
	//outportb(m_unPortBase + MCR, temp);
	temp = (inportb(m_unPortBase + IER)) | IER_RX_INT;//|IER_TX_INT;
	outportb(m_unPortBase + IER, temp);
	temp = inportb(PIC8259_IMR) & ComIRQ[m_unPortNo-1];
	outportb(PIC8259_IMR, temp);
	enable();
}

/* Go off-line */
void GSerial::CommOff(void)
{
	 int  temp;

	disable();
	temp = inportb(PIC8259_IMR) | ~ComIRQ[m_unPortNo-1];
	outportb(PIC8259_IMR, temp);
	outportb(m_unPortBase + IER, 0);
	outportb(m_unPortBase + MCR, 0);
	enable();
}



/* Set the port number to use */
int GSerial::SetPortBaseAddr(int Port)
{
	if((Port<1)||(Port>6))
		return(-1);
	m_unPortNo = Port;
	m_unPortBase = PortBaseAddr[m_unPortNo-1];
	return (0);
}

/* This routine sets the speed; will accept funny baud rates. */
/* Setting the speed requires that the DLAB be set on.        */
int GSerial::SetSpeed(int Speed)
{
	char	c;
	int		divisor;

	if (Speed == 0)            /* Avoid divide by zero */
		return (-1);
	else
		divisor = (int) (115200L/Speed);

	if (m_unPortBase == 0)
		return (-1);

	disable();
	c = inportb(m_unPortBase + LCR);
	outportb(m_unPortBase + LCR, (c | 0x80)); /* Set DLAB */
	outportb(m_unPortBase + DLL, (divisor & 0x00FF));
	outportb(m_unPortBase + DLH, ((divisor >> 8) & 0x00FF));
	outportb(m_unPortBase + LCR, c);          /* Reset DLAB */
	enable();

	return (0);
}

/* Set other DATA Format communications parameters */
int GSerial::SetDataFormat(int Parity, int Bits, int StopBit)
{
	int  setting;

	if (m_unPortBase == 0)
		return (-1);
	if (Bits < 5 || Bits > 8)
		return (-1);
	if (StopBit != 1 && StopBit != 2)
		return (-1);
	if (Parity != LCR_NO_PARITY && Parity != LCR_ODD_PARITY && Parity != LCR_EVEN_PARITY)
		return (-1);

	setting  = Bits-5;
	setting |= ((StopBit == 1) ? 0x00 : 0x04);
	setting |= Parity;

	disable();
	outportb(m_unPortBase + LCR, setting);
	enable();

	return (0);
}


void GSerial::CloseSerialPort(void)
{
	CommOff();
	ResetVects();
}

/* Set up the port */
int GSerial::InitSerialPort(int Port, int Speed, int Parity, int Bits, int StopBit)
{
	int flag = 0;
	if (SetPortBaseAddr(Port))
	  flag = -1;
	if (SetSpeed(Speed))
	  flag = -1;
	if (SetDataFormat(Parity, Bits, StopBit))
	  flag = -1;
	return(flag);
}



////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////COM1//////////////////////////////////////////////////////////
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;
	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;           // reset pointer
			break;
		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 gsCOM1, 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;


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

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

	fprintf(stdout, "Now we are ready to go: \n\n");



	do {
		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: fprintf(stderr, "\nbye.\n");
					  return (0);

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


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
尤物av一区二区| 久久精品在这里| 亚洲一区自拍偷拍| 欧美亚洲国产一区在线观看网站 | 天天综合色天天综合色h| 欧美日韩一区二区三区高清| 亚洲国产一区二区视频| 欧美一区二区三区在线观看 | 久久网站热最新地址| 国产一区二三区| 中文字幕av免费专区久久| 99re这里都是精品| 亚洲成人av一区二区三区| 日韩视频一区二区| 波多野结衣的一区二区三区| 亚洲精品欧美激情| 91精品婷婷国产综合久久| 国产伦精一区二区三区| 亚洲欧美韩国综合色| 在线播放日韩导航| 国产成人日日夜夜| 香蕉av福利精品导航| 精品成人a区在线观看| 97se亚洲国产综合在线| 日韩国产在线观看| 亚洲国产电影在线观看| 欧美午夜在线观看| 91在线国产观看| 亚洲成人激情av| 久久久久久久久久久99999| 色视频一区二区| 国内欧美视频一区二区| 亚洲精品亚洲人成人网| 精品欧美黑人一区二区三区| 91色视频在线| 精品一区二区三区影院在线午夜| 亚洲少妇30p| 欧美大片一区二区三区| 91黄色小视频| 国产精品一色哟哟哟| 午夜电影久久久| 国产精品电影一区二区三区| 日韩精品专区在线影院重磅| 色狠狠色噜噜噜综合网| 国产传媒一区在线| 日韩av在线播放中文字幕| 最近日韩中文字幕| 2021中文字幕一区亚洲| 欧美日韩国产系列| 91亚洲午夜精品久久久久久| 国产一区二区三区四| 免费在线观看一区| 亚洲国产精品嫩草影院| 专区另类欧美日韩| 久久精品亚洲国产奇米99| 91精品国产综合久久久久久久久久 | 亚洲国产精品久久不卡毛片| 国产欧美日韩不卡| 欧美不卡在线视频| 在线综合视频播放| 在线看国产一区| 99在线精品视频| 粉嫩av亚洲一区二区图片| 久久99国产精品免费| 日本中文一区二区三区| 亚洲一区二区在线免费观看视频| 国产三级三级三级精品8ⅰ区| 91精品麻豆日日躁夜夜躁| 欧美色成人综合| 在线观看亚洲a| 在线一区二区三区四区五区| 91玉足脚交白嫩脚丫在线播放| 国产成人av电影在线观看| 国产尤物一区二区| 国产一区二区三区黄视频 | 中文字幕一区视频| 国产精品视频你懂的| 国产欧美va欧美不卡在线| 国产午夜精品久久久久久久| 2024国产精品| 久久蜜臀中文字幕| 国产偷v国产偷v亚洲高清| 久久久综合激的五月天| 久久久久久麻豆| 亚洲国产电影在线观看| 国产精品看片你懂得| 中文字幕一区免费在线观看 | 亚洲另类在线一区| 亚洲专区一二三| 午夜精品一区二区三区电影天堂 | 欧美美女bb生活片| 91精品蜜臀在线一区尤物| 91麻豆精品国产91久久久久| 日韩一区二区三免费高清| www国产成人免费观看视频 深夜成人网| 精品黑人一区二区三区久久| 国产喂奶挤奶一区二区三区| 国产精品国产自产拍在线| 亚洲青青青在线视频| 亚洲第一搞黄网站| 精品一区二区久久| 成人免费看黄yyy456| 欧美在线小视频| 欧美一区二区人人喊爽| 久久综合狠狠综合久久综合88| 国产精品久久久久影院色老大| 亚洲综合色婷婷| 久久狠狠亚洲综合| 成人黄色软件下载| 在线观看视频一区二区欧美日韩| 制服丝袜激情欧洲亚洲| 久久精品免视看| 亚洲一区二区三区爽爽爽爽爽| 美脚の诱脚舐め脚责91| 国产成人免费在线视频| 欧美三级电影一区| 久久久欧美精品sm网站| 亚洲欧美偷拍卡通变态| 蜜臀91精品一区二区三区| 成人综合婷婷国产精品久久蜜臀 | 国产精品一区免费视频| 色婷婷国产精品| 亚洲精品一区二区三区四区高清| 国产欧美日韩另类一区| 亚洲成人av在线电影| 国产成人三级在线观看| 555www色欧美视频| 亚洲欧洲精品一区二区三区| 乱中年女人伦av一区二区| aaa国产一区| 精品成人私密视频| 亚洲午夜视频在线| 成人精品国产免费网站| 欧美一级久久久| 一区二区三区免费看视频| 国产高清亚洲一区| 91精品国产综合久久久久久漫画| 日韩毛片视频在线看| 国产一区二区网址| 欧美一区二区黄色| 亚洲综合区在线| 99视频精品全部免费在线| 精品久久人人做人人爽| 亚洲国产综合人成综合网站| 成人禁用看黄a在线| 欧美xxxx在线观看| 日韩福利视频网| 在线观看日韩一区| 亚洲特黄一级片| 国产精品正在播放| 精品动漫一区二区三区在线观看| 午夜精品久久久久久久99水蜜桃| heyzo一本久久综合| 国产人成一区二区三区影院| 美腿丝袜亚洲色图| 555www色欧美视频| 午夜精品福利久久久| 色综合久久久久久久久| 国产精品久久久久四虎| 国产·精品毛片| 久久久精品免费网站| 国产主播一区二区| www一区二区| 国产一区二区福利| 国产亚洲欧洲997久久综合| 国产在线精品一区二区夜色| 日韩欧美一卡二卡| 久久国产人妖系列| 精品欧美一区二区三区精品久久| 裸体一区二区三区| 日韩一区二区不卡| 久久99精品一区二区三区| 欧美白人最猛性xxxxx69交| 美腿丝袜在线亚洲一区 | 一本色道久久综合狠狠躁的推荐| 国产精品全国免费观看高清| 成人精品国产福利| 亚洲欧洲在线观看av| 一本高清dvd不卡在线观看| 亚洲人xxxx| 欧美在线高清视频| 日韩vs国产vs欧美| 精品成a人在线观看| 成人一区二区三区| 成人欧美一区二区三区视频网页| 91麻豆蜜桃一区二区三区| 亚洲免费在线观看视频| 欧美一a一片一级一片| 日韩极品在线观看| 精品日韩在线观看| 成人激情校园春色| 亚洲二区在线观看| 日韩视频一区二区三区在线播放| 国产一区二区三区精品视频| 国产精品欧美久久久久无广告| 色婷婷精品大在线视频| 琪琪一区二区三区| 国产欧美视频在线观看| 在线亚洲高清视频| 另类专区欧美蜜桃臀第一页|