Date: Fri, 28 Oct 1994 12:31:49 GMT From: gilliard AT lectra DOT fr (Laurent Pierre Gilliard) To: djgpp AT sun DOT soe DOT clarkson DOT edu Subject: serial interrupt I want to read a serial port using serial interruption. I've a program in BorlandC which is ok. I've tried to change it for GCC but.... Searching help! Thanks. #define GCC /* else TURBOC */ #define COM 1 /* or 2 */ #include #include #include #include #include #include #include #include #include #include #include #ifdef GCC #include #include #endif #define FAUX 0 #define VRAI 1 #define ICR 0x20 /* Int Control reg */ #define EOI 0x20 /* End of Int */ #define IMR 0x21 /* Int Mask reg */ #if COM==1 #define IER 0x3F9 /* Int Enable reg */ #define IIR 0x3FA /* Int Identif reg */ #define LSR 0x3FD /* Line Status reg */ #define TDR 0x3F8 /* Transmit Data reg */ #define RDR 0x3F8 /* Receive Data reg */ #define DLR 0x3FB /* Divisor Latch reg */ #define DRL 0x3F8 /* DLR Low */ #define DRH 0x3F9 /* DLR High */ #define MCR 0x3FC /* Modem Control reg */ #define LCR 0x3FB /* Line Control reg */ #else #define IER 0x2F9 /* Int Enable reg */ #define IIR 0x2FA /* Int Identif reg */ #define LSR 0x2FD /* Line Status reg */ #define TDR 0x2F8 /* Transmit Data reg */ #define RDR 0x2F8 /* Receive Data reg */ #define DLR 0x2FB /* Divisor Latch reg */ #define DRL 0x2F8 /* DLR Low */ #define DRH 0x2F9 /* DLR High */ #define MCR 0x2FC /* Modem Control reg */ #define LCR 0x2FB /* Line Control reg */ #endif void InitLine(void); #ifdef GCC void RSInt(); #else void interrupt RSInt(); #endif void RestoreLine(); #ifdef GCC _go32_dpmi_seginfo OldRS, new_handler; #else void interrupt (*OldRS)(); #endif struct { /* Save lines status */ char imr, lcr, drl, drh, mcr, lsr; } etat_ligne; volatile char Caractere; void InitLine(void) { char c; disable(); etat_ligne.imr = inportb(IMR); etat_ligne.lcr = inportb(LCR); etat_ligne.drl = inportb(DRL); etat_ligne.drh = inportb(DRH); etat_ligne.mcr = inportb(MCR); etat_ligne.lsr = inportb(LSR); outportb(LCR,0x80); /* Init de la vitesse */ outportb(DRL,0x0C); /* 9600 */ outportb(DRH,0); outportb(LCR,3); /* 8 bits, 1 de stop, pas de parite */ outportb(MCR,0x08); outportb(IER,1); /* Generer int des que car present */ c = inportb(IMR); c &= COM==1 ? 0xEF : 0xF7; outportb(IMR,c); #ifdef GCC _go32_dpmi_get_protected_mode_interrupt_vector(COM==1 ? 0x0C : 0x0B, &OldRS); new_handler.pm_offset = (int)RSInt; new_handler.pm_selector = _go32_my_cs(); _go32_dpmi_chain_protected_mode_interrupt_vector(COM==1 ? 0x0C : 0x0B, &new_handler); #else OldRS = getvect(COM==1 ? 0x0C : 0x0B); setvect(COM==1 ? 0x0C : 0x0B, RSInt); #endif enable(); } #ifdef GCC void RSInt() { #else void interrupt RSInt() { #endif unsigned etat; etat = inportb(LSR); /* Line state */ if (etat&1) { Caractere = inportb(RDR); } outportb(ICR,EOI); } void RestoreLine(void) { while (!(inportb(LSR)&0x20)); /* Wait end of transmission */ disable(); outportb(IMR,etat_ligne.imr); outportb(LCR,etat_ligne.lcr); outportb(DRL,etat_ligne.drl); outportb(DRH,etat_ligne.drh); outportb(MCR,etat_ligne.mcr); outportb(LSR,etat_ligne.lsr); outportb(IER,0); /* End of interruptions */ #ifdef GCC _go32_dpmi_set_protected_mode_interrupt_vector(COM==1 ? 0x0C : 0x0B, &OldRS); #else setvect(COM==1 ? 0x0C : 0x0B, OldRS); #endif enable(); } void main() { printf("Start\n"); InitLine(); while (1) { if(kbhit()) break; printf("%c\n",Caractere); } RestoreLine(); printf("End\n"); }