📄 com_test.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 + -