Some early telegraph schemes used variable-length pulses (as in Morse code) and rotating clockwork mechanisms to transmit alphabetic characters. The first serial communication devices (with fixed-length pulses) were rotating mechanical switches (commutators). Various character codes using 5, 6, 7, or 8 data bits became common in teleprinters and later as computer peripherals. The teletypewriter made an excellent general-purpose I/O device for a small computer.
Gordon Bell of DEC designed the first UART, occupying an entire circuit board called a line unit, for the PDP series of computers beginning with the PDP-1.23 According to Bell, the main innovation of the UART was its use of sampling to convert the signal into the digital domain, allowing more reliable timing than previous circuits that used analog timing devices with manually adjusted potentiometers.4 To reduce the cost of wiring, backplane and other components, these computers also pioneered flow control using XON and XOFF characters rather than hardware wires.
DEC condensed the line unit design into an early single-chip UART for their own use.5 Western Digital developed this into the first widely available single-chip UART, the WD1402A, around 1971. This was an early example of a medium-scale integrated circuit. Another popular chip was the SCN2651 from the Signetics 2650 family.
An example of an early 1980s UART was the National Semiconductor 8250, which was used in the original IBM PC's Asynchronous Communications Adapter card.6 In the 1990s, newer UARTs were developed with on-chip buffers. This allowed higher transmission speed without data loss and without requiring such frequent attention from the computer. For example, the popular National Semiconductor 16550 has a 16-byte FIFO, and spawned many variants, including the 16C550, 16C650, 16C750, and 16C850.
Depending on the manufacturer, different terms are used to identify devices that perform the UART functions. Intel called their 8251 device a "Programmable Communication Interface" because it was actually a USART and capable of synchronous operation as well as asynchronous. It was introduced in 1979. MOS Technology 6551 was known under the name "Asynchronous Communications Interface Adapter" (ACIA). The term "Serial Communications Interface" (SCI) was first used at Motorola around 1975 to refer to their start-stop asynchronous serial interface device, which others were calling a UART. Zilog manufactured a number of Serial Communication Controllers or SCCs.
Starting in the 2000s, most IBM PC compatible computers removed their external RS-232 COM ports and used USB ports that can send data faster. For users who still need RS-232 serial ports, external USB-to-UART bridges are now commonly used. They combine the hardware cables and a chip to do the USB and UART conversion. Cypress Semiconductor and FTDI are two of the significant commercial suppliers of these chips.7 Although RS-232 ports are no longer available to users on the outside of most computers, many internal processors have UARTs built into their chips to give hardware designers the ability to interface with other chips or devices that use RS-232 or RS-485 for communication.
See also: Asynchronous serial communication
A UART contains those following components:
The universal asynchronous receiver-transmitter (UART) takes bytes of data and transmits the individual bits in a sequential fashion.8 At the destination, a second UART re-assembles the bits into complete bytes. Each UART contains a shift register, which is the fundamental method of conversion between serial and parallel forms. Serial transmission of digital information (bits) through a single wire or other medium is less costly than parallel transmission through multiple wires.
The UART usually does not directly generate or receive the external signals used between different items of equipment. Separate interface devices are used to convert the logic level signals of the UART to and from the external signaling levels, which may be standardized voltage levels, current levels, or other signals.
Communication may be 3 modes:
For UART to work the following settings need to be the same on both the transmitting and receiving side:
For the voltage level, two UART modules work well when they both have the same voltage level, e.g 3V-3V between the two UART modules. To use two UART modules at different voltage levels, a level shifting circuit needs to be added externally.9
A UART frame consists of five elements:
In the most common settings of 8 data bits, no parity and 1 stop bit (i.e. 8N1), the protocol efficiency is 8/10 = 80%. For comparison, Ethernet's protocol efficiency when using maximum throughput frames with payload of 1500 bytes is up to 95% and up to 99% with 9000 byte jumbo frames. However due to Ethernet's protocol overhead and minimum payload size of 42 bytes, if small messages of one or a few bytes are to be sent, Ethernet's protocol efficiency drops much lower than the UART's 8N1 constant efficiency of 80%.
The idle, no data state is high-voltage, or powered. This is a historic legacy from telegraphy, in which the line is held high to show that the line and transmitter are not damaged.
Each character is framed as a logic low start bit, data bits, possibly a parity bit and one or more stop bits. In most applications, the least significant data bit (the one on the left in this diagram) is transmitted first, but there are exceptions (such as the IBM 2741 printing terminal).
All operations of the UART hardware are controlled by an internal clock signal which runs at a multiple of the data rate, typically 8 or 16 times the bit rate. The receiver tests the state of the incoming signal on each clock pulse, looking for the beginning of the start bit. If the apparent start bit lasts at least one-half of the bit time, it is valid and signals the start of a new character. If not, it is considered a spurious pulse and is ignored. After waiting a further bit time, the state of the line is again sampled and the resulting level clocked into a shift register. After the required number of bit periods for the character length (5 to 8 bits, typically) have elapsed, the contents of the shift register are made available (in parallel fashion) to the receiving system. The UART will set a flag indicating new data is available, and may also generate a processor interrupt to request that the host processor transfers the received data.
Communicating UARTs have no shared timing system apart from the communication signal. Typically, UARTs resynchronize their internal clocks on each change of the data line that is not considered a spurious pulse. Obtaining timing information in this manner, they reliably receive when the transmitter is sending at a slightly different speed than it should. Simplistic UARTs do not do this; instead they resynchronize on the falling edge of the start bit only, and then read the center of each expected data bit, and this system works if the broadcast data rate is accurate enough to allow the stop bits to be sampled reliably.1011
It is a standard feature for a UART to store the most recent character while receiving the next. This "double buffering" gives a receiving computer an entire character transmission time to fetch a received character. Many UARTs have a small first-in, first-out (FIFO) buffer memory between the receiver shift register and the host system interface. This allows the host processor even more time to handle an interrupt from the UART and prevents loss of received data at high rates.
Transmission operation is simpler as the timing does not have to be determined from the line state, nor is it bound to any fixed timing intervals. As soon as the sending system deposits a character in the shift register (after completion of the previous character), the UART generates a start bit, shifts the required number of data bits out to the line, generates and sends the parity bit (if used), and sends the stop bits. Since full-duplex operation requires characters to be sent and received at the same time, UARTs use two different shift registers for transmitted and received characters. High performance UARTs could contain a transmit FIFO (first in first out) buffer to allow a CPU or DMA controller to deposit multiple characters in a burst into the FIFO rather than have to deposit one character at a time into the shift register. Since transmission of a single or multiple characters may take a long time relative to CPU speeds, a UART maintains a flag showing busy status so that the host system knows if there is at least one character in the transmit buffer or shift register; "ready for next character(s)" may also be signaled with an interrupt.
Transmitting and receiving UARTs must be set for the same bit speed (Baud rate), character length, parity, and number of stop bits for proper operation. The receiving UART may detect some mismatched settings and set a "framing error" flag bit for the host system; in exceptional cases, the receiving UART will produce an erratic stream of mutilated characters and transfer them to the host system.
Typical serial ports used with personal computers connected to modems use one start bit, eight data bits, no parity, and one stop bit; for this configuration, the number of ASCII characters per second equals the bit rate divided by 10.
Some very low-cost home computers or embedded systems that lack a physical UART may instead emulate the protocol with software by sampling the state of an input port or directly manipulating an output port for data transmission. While very CPU-intensive (since the CPU timing is critical), the UART chip can thus be omitted, saving money and space. The technique is known as bit-banging.
A dual UART, or DUART, combines two UARTs into a single chip. Similarly, a quadruple UART or QUART, combines four UARTs into one package, such as the NXP 28L194. An octal UART or OCTART combines eight UARTs into one package, such as the Exar XR16L788 or the NXP SCC2698.
The 28L91 is an upwardly compatible version of the 2691, featuring selectable 8- or 16-byte transmitter and receiver FIFOs, improved support for extended data rates, and faster bus timing characteristics, making the device more suitable for use with high performance microprocessors.
Both the 2691 and 28L91 may also be operated in TIA-422 and TIA-485 modes, and may also be programmed to support non-standard data rates. The devices are produced in PDIP-40, PLCC-44 and 44 pin QFP packages, and are readily adaptable to both Motorola and Intel buses. They have also been successfully adapted to the 65C02 and 65C816 buses. The 28L91 will operate on 3.3 or 5 volts.
The 2692 has a single-byte transmitter holding register and a 4-byte receiver FIFO for each channel. Maximum standard speed of both of the 2692's channels is 115.2 kbit/s.
The 26C92 is an upwardly compatible version of the 2692, with 8-byte transmitter and receiver FIFOs for improved performance during continuous bi-directional asynchronous transmission (CBAT) on both channels at the maximum standard speed of 230.4 kbit/s. The letter C in the 26C92 part number has nothing to do with the fabrication process; all NXP UARTs are CMOS devices.
The 28L92 is an upwardly compatible version of the 26C92, featuring selectable 8- or 16-byte transmitter and receiver FIFOs, improved support for extended data rates, and faster bus timing characteristics, making the device more suitable for use with high performance microprocessors.
The 2692, 26C92 and 28L92 may be operated in TIA-422 and TIA-485 modes, and may also be programmed to support non-standard data rates. The devices are produced in PDIP-40, PLCC-44 and 44 pin QFP packages, and are readily adaptable to both Motorola and Intel buses. They have also been successfully adapted to the 65C02 and 65C816 buses. The 28L92 will operate on 3.3 or 5 volts.
Modems for personal computers that plug into a motherboard slot must also include the UART function on the card. The original 8250 UART chip shipped with the IBM personal computer had a one-character buffer for the receiver and the transmitter each, which meant that communications software performed poorly at speeds above 9600 bit/s, especially if operating under a multitasking system or if handling interrupts from disk controllers. High-speed modems used UARTs that were compatible with the original chip but which included additional FIFO buffers, giving software additional time to respond to incoming data.
A look at the performance requirements at high bit rates shows why the 16-, 32-, 64- or 128-byte FIFO is a necessity. The Microsoft specification for a DOS system requires that interrupts not be disabled for more than 1 millisecond at a time.[dubious – discuss] Some hard disk drives and video controllers violate this specification. 9600 bit/s will deliver a character approximately every millisecond, so a 1-byte FIFO should be sufficient at this rate on a DOS system which meets the maximum interrupt disable timing. Rates above this may receive a new character before the old one has been fetched, and thus the old character will be lost. This is referred to as an overrun error and results in one or more lost characters.
A 16-byte FIFO allows up to 16 characters to be received before the computer has to service the interrupt. This increases the maximum bit rate the computer can process reliably from 9600 to 153,000 bit/s if it has a 1 millisecond interrupt dead time. A 32-byte FIFO increases the maximum rate to over 300,000 bit/s. A second benefit to having a FIFO is that the computer only has to service about 8 to 12% as many interrupts, allowing more CPU time for updating the screen, or doing other chores. Thus the computer's responses will improve as well.
Since the UART's communication protocol is simple, it can be emulated by bit banging GPIO pins in software on modern microcontrollers (e.g. Arduino20 or Teensy21), or on programmable I/O state machines (e.g. Raspberry Pi Pico's PIO2223 or NXP's FlexIO24).
"RS-232 vs. TTL Serial Communication - SparkFun Electronics". www.sparkfun.com. https://www.sparkfun.com/tutorials/215 ↩
C. Gordon Bell, J. Craig Mudge, John E. McNamara, Computer Engineering: A DEC View of Hardware Systems Design, Digital Press, 12 May 2014, ISBN 1483221105, p. 73 http://bitsavers.org/pdf/dec/_Books/Bell-ComputerEngineering.pdf ↩
Allison, David. "Curator, Division of Information Technology and Society, National Museum of American History, Smithsonian Institution". Smithsonian Institution Oral and Video Histories. Retrieved 14 June 2015. http://americanhistory.si.edu/comphist/bell.htm#Inventing%20the%20UART ↩
Oral History of Gordon Bell, 2005, accessed 2015-08-19 http://archive.computerhistory.org/resources/text/Oral_History/Bell_Gordon_1/102702036.05.01.pdf ↩
Technical Reference 6025008 (PDF). Personal Computer Hardware Reference Library. IBM. August 1981. pp. 2–123. http://www.minuszerodegrees.net/manuals/IBM_5150_Technical_Reference_6025005_AUG81.pdf ↩
"FTDI Products". www.ftdichip.com. Retrieved 22 March 2018. http://www.ftdichip.com/FTProducts.htm ↩
Adam Osborne, An Introduction to Microcomputers Volume 1: Basic Concepts, Osborne-McGraw Hill Berkeley California USA, 1980 ISBN 0-931988-34-9 pp. 116–126 /wiki/ISBN_(identifier) ↩
Texas Instrument (2021-03-01). "Universal asynchronous receiver/transmitter (UART)" (PDF). ti.com. p. 6, "2.3.1 Voltage Translation With UART". Retrieved 25 Aug 2023. https://www.ti.com/lit/an/scea065b/scea065b.pdf?ts=1692931646648 ↩
"Determining Clock Accuracy Requirements for UART Communications" (PDF). an2141. Maxim Integrated. 2003-08-07. Retrieved 1 November 2021. https://pdfserv.maximintegrated.com/en/an/AN2141.pdf ↩
"Universal asynchronous receiver/transmitter (UART)" (PDF). SCC2691. Philips NXP. 2006-08-04. p. 14. Retrieved 1 November 2021. https://www.nxp.com/docs/en/data-sheet/SCC2691.pdf#page=14 ↩
Interfacing with a PDP-11/05: the UART, blinkenbone.com, accessed 2015-08-19 http://retrocmp.com/how-tos/interfacing-to-a-pdp-1105/143-interfacing-with-a-pdp-1105-the-uart ↩
"Zilog Product specification Z8440/1/2/4, Z84C40/1/2/3/4. Serial input/output controller" (PDF). 090529 zilog.com http://www.zilog.com/docs/z80/ps0183.pdf ↩
"Zilog Document Download" (PDF). www.zilog.com. Retrieved 22 March 2018. http://www.zilog.com/docs/serial/PS0117.pdf ↩
T'so, Theodore Y. (January 23, 1999). "Re: Serial communication with the 16650". The Mail Archive. Retrieved June 2, 2013. http://www.mail-archive.com/linux-serial@vger.rutgers.edu/msg00065.html ↩
"FAQ: The 16550A UART & TurboCom drivers 1994". Retrieved January 16, 2016. ftp://ftp.cs.utk.edu/pub/shuford/terminal/mswin_serial_faq.txt ↩
Zilog. "SCC/ESCC User Manual UM010901-0601" (PDF). leocom.kr. Retrieved 13 May 2023. http://data.leocom.kr/datasheets/207906_91825.pdf ↩
bill.herrin.us - Hayes ESP 8-port Enhanced Serial Port Manual, 2004-03-02 http://bill.herrin.us/freebies/hayes-esp8/ ↩
"SoftwareSerial Library | Arduino Documentation". Arduino. 2022-10-05. Archived from the original on 2023-06-01. Retrieved 2023-06-10. https://docs.arduino.cc/learn/built-in-libraries/software-serial ↩
Stoffregen, Paul. "AltSoftSerial Library, for an extra serial port". www.pjrc.com. Archived from the original on 2023-03-22. Retrieved 2023-06-10. https://web.archive.org/web/20230322175935/https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html ↩
"Raspberry Pi Pico Serial Communication Example(MicroPython)". Electrocredible. 2023-01-24. Archived from the original on 2023-06-03. Retrieved 2023-06-10. https://web.archive.org/web/20230603201653/https://electrocredible.com/raspberry-pi-pico-serial-uart-micropython/ ↩
McKinney, Josh (2022-11-05). "Programmable IO (PIO) for MIDI with the Rasberry Pi Pico". joshka.net. Archived from the original on 2023-04-04. Retrieved 2023-06-10. https://www.joshka.net/2022/11/pio-for-midi-with-raspberry-pi-pico ↩
Krenek, Pavel (2015). "Emulating UART by Using FlexIO" (PDF). NXP. Archived (PDF) from the original on 2022-10-05. Retrieved 2023-06-10. https://www.nxp.com/docs/en/application-note/AN5034.pdf ↩