In this lesson, you will:
The information provided in this guide is based on Toradex's knowledge base article UART (Linux).
Attention: Never connect a RS-232 output pin to a TTL input. This might lead to permanent damage.
Be introduced to the UART protocol:
UART stands for Universal Asynchronous Receiver-Transmitter. These kinds of interfaces are used to achieve asynchronous serial communication between devices. The transmission speed and the data format are configurable.
There are 4 main pins that may be used on a UART interface:
Note: The RTS and CTS signals are used to achieve hardware flow control. We will not delve into this topic in this tutorial. Therefore, we will only use the RX and TX (and ground) pins.
The following block diagram shows some ways in which UART can be accessed:
Get used to the naming conventions:
The Iris Carrier Board offers 3 UART interfaces common to all SoMs from the Colibri family, presented in the Toradex Name column from the table below. The other columns provide information about the respective protocols, converters or electric standards in which the signals are available on the carrier board:
|Toradex Name||RS232||TTL 3.3V|
The following table relates the Toradex Name to the corresponding Linux device file:
In this lesson, the UART_B interface is used in the examples and the Toradex naming convention (Toradex Name) is used unless otherwise stated.
Note: Please refer to the FAQ for more information on how to use UARTs that are disabled in the default BSP configuration.
The correspondence between UART interface signals and SoM/Carrier Board pins is provided in the following table:
Note: The notation CONNECTOR.PIN will be employed in this lesson, e.g. X12.5 means pin 5 on the X12 connector.
A loopback test will be run from command-line. This will send and receive data from the same serial port to verify if it's working.
Connect your board's UART_B TX pin (X16.32) to its RX pin (X16.31).
From a serial terminal connected to the module, configure the UART_B baud rate using the stty command. We will use a baud rate of 9600 baud:
stty -F /dev/ttymxc1 9600 -echo
Use the cat command to listen for incoming data on the serial port:
cat < /dev/ttymxc1 &
Write to the serial port. The characters sent will be printed back to you in the next line:
echo "Testing UART" > /dev/ttymxc1Testing UART
Now we need to stop the cat-command in the background, to make the UART accessable again. You can do that by killing all running cat-commands.
A UART loopback test can also be written in C.
Termios, the Unix API for terminal I/O will be employed.
An example will be introduced step-by-step. First of all, include some libraries and initialize variables:
Warning: The source codes provided in this guide are distributed under the 3-clause BSD license terms. See below:
To use the serial port, open the serial device using the standard system call open(), passing the device path and the flags as arguments.
Using some functions of the termios library, get the serial port attributes and configure the communication parameters and other properties. This example uses the fairly common 9600/8N1 configuration, standing for a baud rate of 9600 baud, 8 data bits, no parity bit and 1 stop bit.
Now you can use the standard system calls write() and read() to write to and read from the serial port.
First, flush the receiving buffer to discard old data. Then, store a string into the buffer variable and write it to the serial port.
After writing to the serial port, you can read from it. Since it's a loopback, you will read what you just wrote and save it to the buffer variable. Also, don't forget to use the standard system call close() to close the device when you're done. To avoid timing problems, use a delay between writing and reading.
Test the complete code. Create and configure an Eclipse project as described in Module 2.
Build and run the following code:
We can improve upon the code by adding error checks:
The following example demonstrates communication between two UART ports on your board. It shows how to use more than one serial port at a time.
For this example, we will call UART_B "first_uart" and UART_C "second_uart".
Connect UART_B_RXD (X16.31) to UART_C_TXD (X16.35) and UART_B_TXD (X16.32) to UART_C_RXD (X16.34).
Build and run the following code:
This lesson covers the basics of UART usage on Linux. There are other important topics that were not discussed. This FAQ section provides further information and sources.