All about UARTs

Definition
The UART (Universal Asynchronous Receiver/Transmitter), is a large scale integrated circuit which contains all the software programming necessary to fully control the serial port of a PC.

A UART chip is an electronic circuit that transmits and receives data through the serial port. It converts bytes into serial bits for transmission, and vice versa. It also generates and strips the start and stop bits appended to each character.

Once a connection is established, the UART then reconstructs a byte of data based on the receiving line. If parity is in use, the UART will also check the parity for correctness and strip the parity bit off the byte being passed to the computer.

SingleByte FlFO Buffers
The UART speed in most PCs, until recently, used 8250 or 16450 UARTS. These are singlebyte FlFO (FirstIn, FirstOut) buffers. Below is a table of how fast the computer would have to respond to the different rates. The column "Characters", is how often a character arrives at the listed speeds.

COM port (bps) Characters
2400 4 milliseconds
9600 1 millisecond
19200 520 microseconds
38400 260 microseconds

If the computer can not retrieve the data at the above speeds, then it will be overwritten. If this occurs, then that character will be lost. The UART does not only handle serial communications, it also takes care of other tasks, like disk interrupts, keyboard interrupts, screen refresh cycles, and many other items that involve timing with your system. So, as you can see, the UART is doing a lot of other things that can limit how much incoming data it can handle. If the system can not keep up, this is when you see block errors and UART overrun errors. If you receive these errors, it's time to start looking into a buffered UART, such as a 16550.

16 Byte FIFO
Buffered UARTs, used in most newer systems today, like the 16550 UART, can deal with more tasks, due to its buffering abilities. The advantage of the 16550 UART, is that it has a 16 byte FlFO (First in, First Out) buffer. This means the system processor only has to respond to the incoming data every sixteen bytes. This is far better then the system having to deal with every character as it comes into the system.

You may be wondering why you need a 16550 UART. Have you ever been on a bulletin board system and found that characters were dropping from the text being displayed? Or had UART overruns, or SubPacket to long errors when downloading files? If this is the case, chances are you need a better UART. DOS is less graphic intensive then Windows or OS/2, so the 16550 UART is not as important, but can still be needed, depending on the speed of your modem. If you are running Windows or OS/2, and have background tasks running while doing data communication or faxing, chances are you will need a 16550 UART. In general, if you have a 28.8 Kbps modem or faster, you will need a 16550 UART. Also, the slower the machine, the more need there is for a 16550 UART; for as stated before, the UART frees the computer to do other tasks.

At some point you are going to be asking "What type of UART is in my system?". With USRobotics internal modems, the UARTs on the modem boards are all 16550s. External modems do not have UARTs on them. With an external modem, you need to have a serial controller in the system, with the appropriate UART on it. Now a days, motherboards come with the UART on the main board. If you are not sure what type of UART is in your system, you can run Microsoft Diagnostics (MSD) and that will tell you what type of UART is in your system. To run this program, assuming you have DOS 6.0 or higher, just type MSD<enter> and it should come up. If not, then go into your DOS directory and run it from there. If you do not have DOS, consult your operating system manual for information on how to check this.

The early non 'A' 16550 UART chips (UARTs without an 'A' after the 16550) chips, are known to be buggy, so try and avoid using them. There were problems with the FIFO not working correctly. Nowadays, it's common to refer to a 16550AFN as a 16550 (without the revision letters).

UART History
The Original UART was the 8250. By today's standards, this is a very slow chip. The 8250A revision added an extra register which allows software to detect that it is indeed an 8250 UART. Next, the 16450 UART was introduced. It was faster then its predecessors, but not by much. One thing you need to look out for, is that software cannot detect the 16450. It comes up as an 8250, so you may have to look at the chip to be sure what type it is. Next came the straight 16550 UART. This chip has some issues with it and if you happen to still have one of these, you should not enable the UART. It should run without a problem in this state. The next group to come out are the 16550A ('A' series), 16550AF (Fast), and the 16550AFN (new ceramic chip). Except for newer 16650 and 16750 UARTs, which are not commonly used, these are the best chips to have. Their buffering abilities are far superior to the 8250 and 16450.

Windows 3.x Changes
After you have a 16550 UART installed, you need to change your Windows setup to utilize the new chip. Essentially what you will be doing, is turning on the buffering capabilities of the 16550 UART. In order to do this, you will either have to add or change the COMxFIFO line in the [386enh] section of your Windows SYSTEM.INI to read COMxFIFO=1 or COMxFIFO=2. The difference is, when COMxFIFO is equal to 1, it automatically assumes you have a 16550 UART and turns buffering on. If the UART is not there, it just ignores the line. When COMxFIFO is equal to 2, it detects whether or not you have a 16550 UART, and acts accordingly. If you know that you have a 16550 UART, then just set this equal to one. Remember that you replace the 'x' in COMxFIFO with the COM Port the modem is on.

There are several communication drivers available that can help fully utilize your 16550 UART in the Windows 3.x environment. One of these is WFXCOMM.

Note:If you are using Windows for Workgroups 3.11 or Windows 95, you should not change the communication driver to fully utilize the 16550 UART.