From: "Alexei A. Frounze" Newsgroups: comp.os.msdos.djgpp Subject: Re: rs 232 stuff Date: Thu, 22 Feb 2001 17:58:21 -0500 Lines: 317 Message-ID: <9745fs$nl5pp$1@ID-57378.news.dfncis.de> References: <7wMZ3ulbJVB AT 0256597511 DOT t-online DOT de> NNTP-Posting-Host: ip25.rochester6.ny.pub-ip.psi.net (38.26.84.25) X-Trace: fu-berlin.de 982882623 24811321 38.26.84.25 (16 [57378]) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 5.50.4133.2400 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Try this one insted (because it complies with both :): --------8<------- /////////////////////////////////////////////////////// // Serial Chat program by Alexei A. Frounze (c) 2000 // // // // Compiler: Borland C or DJGPP // // // // E-Mail : alexfru AT chat DOT ru // // Homepage: http://alexfru.chat.ru // // Mirror : http://members.xoom.com/alexfru // /////////////////////////////////////////////////////// #include #include #include #include #ifdef DJGPP #include #endif // Baud rates // #define B_110 1040 #define B_150 768 #define B_300 384 #define B_600 192 #define B_1200 96 #define B_2400 48 #define B_4800 24 #define B_9600 12 #define B_19200 6 #define B_38400 3 #define B_57600 2 #define B_115200 1 // Size of character // #define BITS_5 0 #define BITS_6 1 #define BITS_7 2 #define BITS_8 3 // Number of stop bits // #define STOPS_1 0 #define STOPS_2 4 // Parity type // #define PARITY_NO 0 #define PARITY_EVEN 0x18 #define PARITY_ODD 8 // Registers // #define IO_REG 0 #define LO_DIV 0 #define HI_DIV 1 #define INT_REG 1 #define INT_ID 2 #define CONTROL 3 #define MODEM 4 #define STATUS 5 #define MSTATUS 6 // some extra constants #define ESC 27 #define CR 13 #define LF 10 // Base addresses of ports // int base[4]={0,0,0,0}; // Function that finds base addresses of all serial ports // int find_base_addresses() { int res=0, i; short addr; for (i=0;i<4;i++) { #ifndef DJGPP addr = (short) peek (0x40, i*2); #else _dosmemgetw (0x400+i*2, 1, &addr); #endif base[i] = addr; if (addr) res++; } return res; } int OpenCOM (int ComNo, int BaudRate, char Config) { int b; if ((ComNo<1) || (ComNo>4)) return 0; b = base[ComNo-1]; if (!b) return 0; // Waiting while the previous data is being sent... while ((inportb(b+STATUS) & 0x60) != 0x60) {}; // Programming the port outportb (b+CONTROL, 0x80); outportb (b+HI_DIV, BaudRate >> 8); outportb (b+LO_DIV, BaudRate & 0xFF); outportb (b+CONTROL, Config); outportb (b+MODEM, 0); outportb (b+INT_REG, 0); return 1; } int CloseCOM (int ComNo) { int b; if ((ComNo<1) || (ComNo>4)) return 0; b = base[ComNo-1]; if (!b) return 0; outportb (b+INT_REG, 0); outportb (b+MODEM, 0); return 1; } int SendChar (int ComNo, char value) { int b; if ((ComNo<1) || (ComNo>4)) return 0; b = base[ComNo-1]; if (!b) return 0; // Waiting while previous character is being sent while ((inportb(b+STATUS) & 0x20) == 0) {}; // Sending the character outportb (b, value); return 1; } int ReceiveChar (int ComNo, char *value) { int b; if ((ComNo<1) || (ComNo>4)) return 0; b = base[ComNo-1]; if (!b) return 0; // If there is no any available character, quit with result of 0 if ((inportb(b+STATUS) & 1) == 0) return 0; // otherwise we get the character form the port and return result of 1 *value = inportb (b); return 1; } int main() { int serial_ports, i; int ComNo; char c, k; clrscr(); printf ("Serial Chat program by Alexei A. Frounze (c) 2000\n\n"); printf ("E-Mail : alexfru AT chat DOT ru\n"); printf ("Homepage: http://alexfru.chat.ru\n"); printf ("Mirror : http://members.xoom.com/alexfru\n\n"); serial_ports = find_base_addresses(); printf ("There are %d serial ports available.\n", serial_ports); if (!serial_ports) return 0; printf ("\nBase addresses are:\n"); for (i=0;i<4;i++) if (base[i]) printf (" COM%d ... 0x%X\n", 1+i, base[i]); printf ("\nPlease choose COM port number: "); ComNo = getch(); printf ("%c\n", ComNo); ComNo -= '0'; if ((ComNo < 1) || (ComNo > 4)) { printf ("Ivalid number.\n"); return 0; }; if (!base[ComNo-1]) { printf ("COM%d doesn't exist.\n", ComNo); return 0; }; printf ("You've choosen COM%d\n", ComNo); if (!OpenCOM (ComNo, B_9600, BITS_8+STOPS_1+PARITY_NO)) { printf ("Couldn't open the port.\n"); return 0; }; printf ("\nCOM%d port is open. Enjoy the chat. Hit ESC for quit.\n\n", ComNo); while (ReceiveChar (ComNo, &c)) {}; // skip data from the previos session do { if (ReceiveChar (ComNo, &c)) { // if there is a character available... switch (c) { case ESC: printf ("Remote machine disconnected.\n"); // :)) break; case CR: printf ("\n"); // move the cursor to the new line break; default: printf ("%c", c); // print the received chracter } } if (kbhit()) { k = getch(); if (!SendChar (ComNo, k)) { printf ("Couldn't send a character.\n"); return 0; }; } else k=0xFF; } while (k!=ESC); // quit (disconnect :) CloseCOM (ComNo); return 0; } --------8<------- Good Luck -- Alexei A. Frounze alexfru [AT] chat [DOT] ru http://alexfru.chat.ru http://members.xoom.com/alexfru/ http://welcome.to/pmode/ "Dietmar Segbert" wrote in message news:7wMZ3ulbJVB AT 0256597511 DOT t-online DOT de... > Hello, > i have a routine to controll the rs 232 serial Port. > It is writen in turbo C. > Compiling with GCC he makes some Errors. > "oldirq" undefined refernce. > > At the Top of the file i found: > ... > static void (interrupt far *oldirq)(void); > > ... > > int init_232(serial_232_t *sr) > { > int com; > unsigned cntlword; > > com=sr->comport ; /* -1 ; */ > uart_adrs=irq_adr_table[com-1]; /* get base address */ > > /* set default IRQ */ > /* set IRQ=4 for COM1/3, 3 for COM 2/4 */ > sr->irq=(com & 1) == 1 ? 4 : 3; > irqnum=sr->irq; > > /* calculate irq mask bit for PIC */ > irqmask=1<irq; > oldirq=getvect(sr->irq+8); /* get old IRQ vector */ > setvect(sr->irq+8,comint); /* instal serial interupt handler */ > outportb(uart_adrs+LCR,0x83); /* none/8/1 - DLAB set */ > > /* set baud rate */ > outportb(uart_adrs+DATA_REG,baud_table[sr->baud]&0xFF); > outportb(uart_adrs+IER,baud_table[sr->baud]>>8); > > /* calculate control word for LCR */ > cntlword=(2*sr->parity-sr->parity?1:0)<<4; > cntlword|=2*(sr->stops-1); > cntlword|=sr->bits-5; > outportb(uart_adrs+LCR,cntlword); > outportb(uart_adrs+MCR,0xF); /* enable interrupts */ > outportb(uart_adrs+IER,0xF); > outportb(0x21,inportb(0x21)&~irqmask); > > return 0; > } > > > /* > CALL THIS FUNCTION BEFORE PROGRAM EXIT! > > or before calling init_232() for a second time > */ > void deinit_232(void) > { > outportb(uart_adrs+IER,0); /* clear UART interrupts */ > outportb(uart_adrs+MCR,0); > outportb(0x21,inportb(0x21)|irqmask); /* clear PIC */ > setvect(irqnum+8,oldirq); /* restore interrupt vector */ > } > > > > How can i compile this serial stuff with GCC. > If you want i send it complete. > It is from Alex Russel written in turbo C. > > Thanks > > Dietmar >