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

📄 com_test.c

📁 dos 下的串口编程源代码
💻 C
字号:
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <time.h>

#define m_8259_addr1 	0x20
#define m_8259_addr2	0x21
#define s_8259_addr1 	0xa0
#define s_8259_addr2 	0xa1

#define TBR0				0	//Transmite Buffer
#define RBR0				0       //Reseive Buffer
#define IER1				1       //Interrrupt Enable
#define IIR2				2       //Interrupt Index
#define LCR3				3       //Line Control
#define MCR4				4       //Modem Control
#define LSR5				5       //Line Status
#define MSR6				6       //Modem Status
#define SUR7				7       //Spcial Use(not used)
#define LSB8				8       //Low Sub of Baudrate
#define MSB9				9       //High Sub of Baudrate

int COM1_IRQ=4;
int COM2_IRQ=3;
int Com1Addr=0x3f8;
int Com2Addr=0x2f8;
int pointer=0;


void interrupt (*org_int_ptr1)();
void interrupt (*org_int_ptr2)();

unsigned char TX1_Value;
unsigned char RX1_Value;
unsigned char TX2_Value;
unsigned char RX2_Value;
unsigned char Int_Index=0xff;
unsigned char Int_Times=0;

char Tansmit_Data[200]={'<','1','2','3','4','5','6','7','8','9','0',' ','C','O','M',' ','t','o',' ','C','O','M'};
void interrupt COM1_Handle();
void interrupt COM2_Handle();

int GetIntNo( int irq )
{
	if ( irq <= 7 )
		return (irq+8);
	else
		return (irq - 8 + 0x70);
}

void Com_SetIrq(int comno)
{
	int irq;
	disable();
	if(comno==1)
	{
		irq=COM1_IRQ;
		org_int_ptr1 = getvect( GetIntNo(irq) );
		setvect( GetIntNo(irq),COM1_Handle);
	}
	else
	{
		irq=COM2_IRQ;
		org_int_ptr2 = getvect( GetIntNo(irq) );
		setvect( GetIntNo(irq),COM2_Handle);
	}
	if ( irq <= 7 )
		outportb( m_8259_addr2, inportb( m_8259_addr2 ) & (~(1 << irq)) );
	else
	{
		outportb( s_8259_addr2, inportb( s_8259_addr2 ) & (~(1 << (irq-8) )) );
		outportb( m_8259_addr2, inportb( m_8259_addr2 ) & (~(1 << 2 )) );
	}

	enable();
	outportb(m_8259_addr1, 0x20 );

	if ( irq >= 7 )
		outportb(s_8259_addr1, 0x20 );
}

void Com_ResetIrq(int comno)
{
	int irq;

	disable();
	if(comno==1)
	{
		irq=COM1_IRQ;
		setvect( GetIntNo(irq), org_int_ptr1 );
	}
	else
	{
		irq=COM2_IRQ;
		setvect( GetIntNo(irq), org_int_ptr2 );
	}
	if ( irq <= 7 )
		outportb( m_8259_addr2, inportb(m_8259_addr2) | (1<<irq) );
	else
		outportb( s_8259_addr2, inportb(s_8259_addr2) | (1<<(irq-8)) );
	enable();
	outportb(m_8259_addr1, 0x20 );
	if ( irq >= 7 )
		outportb(s_8259_addr1, 0x20 );
}

void Write_Register(int comno,int rigster_no,char value )
{
	int ComAddr;
	if(comno==1)
	{
		ComAddr=Com1Addr;
	}
	else
	{
		ComAddr=Com2Addr;
	}
	if(rigster_no==LCR3)
		value=value&0x7f;
	if(rigster_no==LSB8||rigster_no==MSB9)
	{
		outportb(ComAddr+LCR3,inportb(ComAddr+LCR3)+0x80);
		outportb(ComAddr+rigster_no-8,value);
		outportb(ComAddr+LCR3,inportb(ComAddr+LCR3)&0x7f);
	}
	else
		outportb(ComAddr+rigster_no,value);
}

unsigned char Read_Register(int comno,int rigster_no)
{
	unsigned char value;
	int ComAddr;
	if(comno==1)
	{
		ComAddr=Com1Addr;
	}
	else
	{
		ComAddr=Com2Addr;
	}

	if(rigster_no==LSB8||rigster_no==MSB9)
	{
		outportb(ComAddr+LCR3,inportb(ComAddr+LCR3)+0x80);
		value=inportb(ComAddr+rigster_no-8);
		outportb(ComAddr+LCR3,inportb(ComAddr+LCR3)&0x7f);
		return value;
	}
	else
		return inportb(ComAddr+rigster_no);
}

void Com1_Transmit(char value )
{
	outportb(Com1Addr,value);
}

char Com1_Reseive(void)
{
	return inportb(Com1Addr);
}

void Com2_Transmit(char value )
{
	outportb(Com2Addr,value);
}

unsigned char Com2_Reseive(void)
{
	return inportb(Com2Addr);
}

//		Baud_Rate=48;	//2400 bits/s
//		Baud_Rate=12;	//9600 bits/s
//		Baud_Rate=2;	//57600 bits/s
//		Baud_Rate=1;	//115200 bits/s

void init_Com1()
{
	unsigned char Baud_Rate=12;
	Write_Register(1,LSB8,Baud_Rate&0xff);
	Write_Register(1,MSB9,0x00);// Set Baud rate
	Write_Register(1,LCR3,0x0F);//8 bits with parity and 2 stop bits.
	Write_Register(1,MCR4,0x0B);
	Write_Register(1,IER1,0x01);
	Read_Register(1,LSR5);
	Com_SetIrq(1);
}
void init_Com2()
{
	unsigned char Baud_Rate=12;
	Write_Register(2,LSB8,Baud_Rate&0xff);
	Write_Register(2,MSB9,0x00);// Set Baud rate
	Write_Register(2,LCR3,0x0F);//8 bits with parity and 2 stop bits.
	Write_Register(2,MCR4,0x0B);
	Write_Register(1,IER1,0x01);
	Read_Register(2,LSR5);
//	Com_SetIrq(2);
}

void close_Com1()
{
	Write_Register(1,IER1,0x00);
	Com_ResetIrq(1);
}
void close_Com2()
{
//	Write_Register(2,IER1,0x00);
//	Com_ResetIrq(2);
}

void Com1_Com2()
{
	unsigned char value;

	clrscr();
	TX2_Value=0x55;
	while(!kbhit())
	{
		TX2_Value++;
		Com2_Transmit(TX2_Value);
		RX2_Value=Com2_Reseive();
		gotoxy(1,1);
		printf("COM2 Sentout Value=0x%02x",TX2_Value);
		gotoxy(1,2);
		printf("COM2 Receive Value=0x%02x",RX2_Value);
		gotoxy(1,3);
		printf("Interrupt Times=0x%02x",Int_Times);
//		gotoxy(1,4);
//		printf("Interrupt Register Value=0x%02x",Int_Index);
	}
}

void main()
{
	init_Com1();
	init_Com2();

	Com1_Com2();//com1 to com2 test program

	close_Com1();
	close_Com2();
}


void interrupt COM1_Handle()
{
	unsigned char value=0;

	value=inportb(Com1Addr+IIR2);
	Int_Index=value;
	Int_Times++;
	if(value==0x06)//Receiver Line Status
	{
		inportb(Com1Addr+LSR5);
	}
	else if(value==0x04)//Receive Data Available or RX FIFO trigger
	{
		RX1_Value=inportb(Com1Addr);
		TX1_Value=RX1_Value;
		Com1_Transmit(TX1_Value);
	}
	else if(value==0x0c)//Character Timeout Indication
	{
		RX1_Value=inportb(Com1Addr);
		RX1_Value=0;//fail data;
	}
	else if(value==0x02)//Transmitter Holding Register Empty.
	{
		TX1_Value=RX1_Value;
		Com1_Transmit(TX1_Value);
	}
	else if(value==0x00)//Modem Status
	{
		value=inportb(Com1Addr+MSR6);
	}

	disable();
	outportb(m_8259_addr1, 0x20 );
	if ( COM1_IRQ >= 7 )
		outportb(s_8259_addr1, 0x20 );
	enable();
}

void interrupt COM2_Handle()
{
}

⌨️ 快捷键说明

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