DOS的方式只要針對 0x3f8 <=看你是要用com 1or .....位置不同
先設定通訊的potocol,再建立一個中斷指標的subfunction.
ps: 1.sample 不一定你能用(參考):
2.程式太久了若有問題,你見諒.
#define _COM1_ 0x3F8
#define _COM2_ 0x2F8
#define _COM3_ 0x2E8
#define _COM4_ 0x2E0
#define _8259_ 0x20
#define Rate600 0xc0
#define Rate1200 0xc0
#define Rate1800 0x60
#define Rate2000 0x40
#define Rate2400 0x3a
#define Rate3600 0x30
#define Rate4800 0x20
#define Rate7200 0x18
#define Rate9600 0x0c
#define DataBit5 0x00
#define DataBit6 0x01
#define DataBit7 0x02
#define DataBit8 0x03
#define StopBit 0x04
#define CheckEO 0x08
#define EventBit 0x10
#define OddBit 0x00
#define SetRate 0x80
#define RDataRdy 0x01
#define OverRun 0x02
#define EOError 0x04
#define FarmErr 0x08
#define BrkDetec 0x10
void ( interrupt far *_old_irq4_ )( );
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void init_rs232(int _Com_,int _Rate,int _Status)
{
#ifndef _Demo
outp((_Com_ LineCont),SetRate); //ENABLE CHANGE TRANSFER RATE
outp(_Com_,_Rate); //SET RATE LSB
outp((_Com_ IntEnReg),0x00); //SET RATE MSB
outp((_Com_ LineCont),(_Status & 0x7f)); //ENABLE CHANGE TRANSFER RATE
outp((_Com_ ModemCon),0x03); //set modem work in no error
outp((_Com_ IntEnReg),0x01); //set revice data to interrupt
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void Transfer_Data(int _Com_,char _Data)
{
#ifndef _Demo
if(inp(_Com_ LinStats) && 0x20){
outp(_Com_,_Data);
// printf("%1x",_Data);
}
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void interrupt far _read_data_from_com1( )
{
#ifndef _Demo
outp( 0x20, 0x20 ); // E.O.I.
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void _setup_new_irq3( )
{
#ifndef _Demo
_old_irq3_ = _dos_getvect( 0x0B ); // backup old irq3 sub.
_dos_setvect( 0x0B, _read_data_from_com2 ); // setup new irq3 sub.
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void _restore_old_irq3( )
{
#ifndef _Demo
_dos_setvect( 0x0B, _old_irq3_ ); // restore old irq3 sub.
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void _disable_irq3( )
{
#ifndef _Demo
outp( _8259_, inp( _8259_ )|0x08 );
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void _enable_irq3( )
{
#ifndef _Demo
outp( _8259_, inp( _8259_ )&0xF7 );
#endif
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void _enable_rcv_interrupt( int _port_ )
{
#ifndef _Demo
int _status;
_status = inp( _port_ LineCont )&0x7F;
outp( _port_ LineCont, _status ); // set DLAB = 0
outp( _port_ IntEnReg, 1 ); // enable RXY interrupt
( _port_==_COM1_ ) ? _enable_irq4( ) : _enable_irq3( );
#endif
}
//////////////////////////////////////////////////
void _disable_rcv_interrupt( int _port_ )
{
#ifndef _Demo
int _status;
_status = inp( _port_ LineCont )&0x7F;
outp( _port_ LineCont, _status ); // set DLAB = 0
outp( _port_ IntEnReg, 0 ); // disable RXY interrupt
( _port_==_COM1_ ) ? _disable_irq4( ) : _disable_irq3( );
#endif
}//////////////////////////////////////////////////
//////////////////////////////////////////////////
main()
{
//init Com port
init_rs232(_COM1_,Rate9600,DataBit8|CheckEO|OddBit|StopBit);
_setup_new_irq4();
_enable_rcv_interrupt( _COM1_ );
Transfer_Data(_COM1_,0x2);
delay(10);
//exit
_restore_old_irq4( );
}