Path: utzoo!yunexus!ists!jarvis.csri.toronto.edu!mailrus!iuvax!rutgers!pyrnj!pyrdc!gmu90x!gmuvax2!smasters From: smasters@gmuvax2.gmu.edu (Shawn Masters) Newsgroups: comp.lang.c Subject: Re: Serial Com Message-ID: <585@gmuvax2.gmu.edu> Date: 18 Nov 89 15:44:20 GMT Article-I.D.: gmuvax2.585 References: <89111504064675@masnet.uucp> Reply-To: smasters@gmuvax2.UUCP (Shawn Masters) Organization: George Mason Univ. Fairfax, Va. Lines: 35 Summary:Must be interrupt driven. Since I assume your using a PC, I'll relay what I found with using the IBM BIOS serial port routines. The IBM BIOS only reads one character at a time, only when it's asked for, and only the one in the serial ports send recieve buffer. This causes lose of data in a few instances: 1)When the data rate is fast enough that the next character is already started before your program asks for the last one. The BIOS will return the character, but if you look at the high 8-bits, it also returns an error. 2)When you write to the buffer, when data is in there. I've never had this happen as to the nature of those past programs that used the BIOS call. On a fast machine with nothing else to do, you might get away with a few errors at the low speeds, and a number of errors in the higher speeds(normally at the begining of lines, why I don't know, that's just what seems to happen). If you know what the input and output is going to be like, then you can grab it with little or no problem. This though is rarely true, and a bad way of doing things. The way to go, is to intercept the COM interrupt, with a function that stores the data in a buffer. When the buffer is near full, you send a flow control(XOFF or EIA). Then when the buffer is near empty(your program has read the values at it's leisure), you send another flow control to start it back up again. This is how 9600 is done reliably on old PC's even with disk transfers and all sorts of other stuff going on. One last thing, to make this work you must ineable the interrupt on the UART in your PC. If this isn't done, nothing will be read into the buffer, or atleast until it checks. Much like a baby that doesn't cry(how many new parents are interrupt driven?). Shawn C. Masters George Mason University smasters@gmuvax2.gmu.edu