|
Вот пример инициализации COM-порта:
#define PORT1 0x3F8
#define INTVECT1 0xC
#define PORT2 0x2F8
#define INTVECT2 0xB
void InstallCom1(long baud,int nbit,int parity,int stopbit)
{
outp(PORT1+1,0); //запрещаем прерывания от UART
oldvectCom1 = _dos_getvect(INTVECT1); //получаем старый вектор прерывания
_dos_setvect(INTVECT1,SerialISR1); //устанавливаем новый вектор прерывания
outp(PORT1+3,0x80); //устанавливаем режим загрузки делителя
//скорость передачи
switch( baud )
{
case 110L: baud = BR_110; break;
case 150L: baud = BR_150; break;
case 300L: baud = BR_300; break;
case 600L: baud = BR_600; break;
case 1200L: baud = BR_1200; break;
case 2400L: baud = BR_2400; break;
case 4800L: baud = BR_4800; break;
case 9600L: baud = BR_9600; break;
case 19200L: baud = BR_19200; break;
case 38400L: baud = BR_38400; break;
case 57600L: baud = BR_57600; break;
case 115200L: baud = BR_115200; break;
default: baud = BR_9600;
}
outp(PORT1+0, baud & 0xFF ); //загружаем младший байт делителя
outp(PORT1+1,baud>>8); //загружаем старший байт делителя
//кол-во бит
switch( nbit )
{
case 5: nbit = bit_5; break;
case 6: nbit = bit_6; break;
case 7: nbit = bit_7; break;
case 8: nbit = bit_8; break;
default: nbit = bit_8;
};
//четность
switch( parity )
{
case 0: parity = NoParity; break;
case 1: parity = Odd; break;
case 2: parity = Even; break;
default: parity = NoParity;
};
//стоп-биты
switch( stopbit )
{
case 1: stopbit = OneStopBit; break;
case 2: stopbit = TwoStopBit; break;
default: stopbit = OneStopBit;
};
outp(PORT1+3,nbit|parity|stopbit); //настраиваем формат передачи: кол-во бит/паритет/стоп-бит
outp(PORT1+2,0x07); //буфер FIFO - 1 байт, включаем буфер
outp(PORT1+4,0x0B); //устанавливаем линии RTS, DTR, OUT1
outp(0x21,inp(0x21)&0xEF); //настраиваем регистр маски прерываний контроллера прер-й
outp(PORT1+1,0x01); //разрешаем контроллеру UART прерывание по приему байта
};
Или второй вариант (не моё, идет на компашке вместе с I-7188):
#define Txbuf 0x00 /* tx buffer */
#define Rxbuf 0x00 /* rx buffer */
#define Dll 0x00 /* baud lsb */
#define Dlh 0x01 /* baud msb */
#define Ier 0x01 /* int enable reg */
#define Fcr 0x02 /* FIFO control register */
#define Iir 0x02 /* Interrupt Identification Register */
#define Lcr 0x03 /* line control reg */
#define Dfr 0x03 /* Data format reg */
#define Mcr 0x04 /* modem control reg */
#define Lsr 0x05 /* line status reg */
int InstallCom(int iPort,unsigned long lBaudRate,int iData,int iParity,int iStop)
{ int uart,i;
char ratehi,ratelo;
int cc;
int far *ComBase=(int far *)0x00400000L;
switch(iPort) {
case 1 :
if(OldIntVect1) RestoreCom(1);
iBase1=ComBase[0];
return InstallCom1(lBaudRate,iData,iParity,iStop);
case 2 :
if(OldIntVect2) RestoreCom(2);
iBase2=ComBase[1];
return InstallCom2(lBaudRate,iData,iParity,iStop);
default: printf("Error:PortError,(iPort=%d)",iPort); getch();
return PortError; /* port must 1/2 */
}
}
int InstallCom1(unsigned long baud, int data, int parity, int stop)
{ int cc;
err1=0;
cc=GetBaudData(baud,data,parity,stop);
if(cc) return cc;
/* _asm cli */ disable();
save232[0][2]=inp(iBase1+Lcr); /* format */
outp(iBase1+Lcr,0x80); /* 1 set DLAB (baud rate) */
save232[0][0]=inp(iBase1+Dll); /* baud rate */
save232[0][1]=inp(iBase1+Dlh);
outp(iBase1+Dll,ratelo);
outp(iBase1+Dlh,ratehi);
outp(iBase1+Lcr,format); /* 2. data format */
save232[0][3]=inp(iBase1+Ier); /* interrupt status*/
outp(iBase1+Fcr, 0x87); /* 3. enable & clear FIFO */
outp(iBase1+Ier, 0x01); /* 4. enable COM1 interrupt */
outp(iBase1+Mcr,0x0b); /* set DTR line active */
In_InIdx1=In_OutIdx1=Out_InIdx1=Out_OutIdx1=0; /* 5. init QUEUE */
OldIntVect1=IntVect[12]; /* save old ISR */
IntVect[12]=(unsigned long)Serial1_Isr; /* install new ISR */
outp(0x21,inp(0x21) & 0xef); /* enable IRQ 4 for COM1 */
/*_asm sti */ enable();
return(NoError);
}
Если нужно, могу скинуть полные исходники по e-mail.
|