发表于:2005-12-02 23:26:00
4楼
//这是基于嵌入式DOS系统,可以参考一下
//*************************************************************************
//**函 数 名:InitUART
//**输 入:BaudIdx - 波特率设定
//** : 1: 115.2kbps
//** : 2: 57.6kbps
//** : 3: 38.4kbps
//** : 6: 19.2kbps
//** : 12: 9600bps
//**输 出:int - 0 成功 -1 失败
//**功能描述:端口初始化(默认COM2)
//**全局变量:
//**调用模块:
//**作 者:叶帆
//**日 期:2005-11-25 23:41:17
//**修 改 人:
//**日 期:
//**版 本:V1.0.0
//*************************************************************************
int InitUART( int BaudIdx )
{
int intValue;
tport = 0x2f8;
outportb(tport + LCR, 0x80); // DLAB = 1, set baud reg access
outportb(tport + BRDH, BaudIdx>>8);
outport(tport + BRDL, BaudIdx);
outportb(tport + LCR, 0x1b); // 8bit 1stop even_parity
outportb(tport + IER, 0x03); // set IER value
outportb(tport + MCR, 0x08); // set MCR value
intValue = (int)inportb(tport + LSR); // clear any line status interrupt
if( intValue == -1 ) return -1;
inportb(tport + RDR); // clear any receive interrupt
inportb(tport + IIR); // clear any transmitter interrupt
inportb(tport + MSR); // clear any modem status interrupt
outportb(tport + FCR, 0); // disable FIFO in 16C550
outportb(tport + IER, 0); // some clones require this!?
outportb(tport + IER, 0x01);
IBufGetIdx = 0;
IBufPutIdx = 0;
OBufGetIdx = 0;
OBufPutIdx = 0;
return 0;
}
//*************************************************************************
//**函 数 名:COM2_ISR
//**输 入:__CPPARGS
//**输 出:无
//**功能描述:COM2口中断程序
//**全局变量:
//**调用模块:
//**作 者:叶帆
//**日 期:2005-11-25 23:41:17
//**修 改 人:
//**日 期:
//**版 本:V1.0.0
//*************************************************************************
void interrupt COM2_ISR(__CPPARGS)
{
int intValue;
unsigned int i;
unsigned char status;
enable( );
status = inportb(tport + IIR) & 7;
while( status != 1 )
{
intValue = inportb(tport + LSR);
switch (status)
{
case 0: // MODEM status change
inportb(tport + MSR);
break;
case 2: // THR empty 发送数据,一个一个的发送
StartSend: // 标签
//--------
intValue = GetOutputData( );
if( intValue != -1 )
{
outportb( tport+THR, intValue );
}
else
{
// disable THR interrupt as no data any more
outportb( tport+IER, inportb(tport+IER) & 0xd);
// wait transmit shift register empty
for( i=0; i<10000; i++ )
{
if( (inportb(tport + LSR)&0x60) == 0x60 ) break;
}
// disable RS485 data send by RTS=0, DTR=0
outportb( tport+MCR, 0x08);
}
break;
//---------
case 4: // received data available
PutInputData( inportb( tport+RDR ) );
break;
case 6: // Line status change
break;
}
status = inportb(tport + IIR) & 7;
}
// These ugly two lines are here because some PC clones will not give you the
// THR empty interrupt if there is a simultaneous RX available interrupt.
if( (inportb(tport + IER)&2) && (inportb(tport + LSR) & 0x20) )
{
goto StartSend;
}
outportb( 0x20, 0x63 ); // specific EOI command for IRQ3
}
//*************************************************************************
//**函 数 名:GetOutputData
//**输 入:无
//**输 出:int - -1 缓冲区无数据 ,非 -1 实际数据
//**功能描述:COM2口中断程序
//**全局变量:
//**调用模块:
//**作 者:叶帆
//**日 期:2005-11-25 23:41:17
//**修 改 人:
//**日 期:
//**版 本:V1.0.0
//*************************************************************************
int GetOutputData( )
{
if (OBufGetIdx < OBufPutIdx)
{
return (int)OutputBuf[OBufGetIdx++];
}
return -1;
}