Here is the test instruction, however I found the receive part does not working
Using the UART
If you are running Raspbian or similar then the UART will be used as a serial console. Using a suitable cable, such as the TTL-232R-3V3-WE, you can connect it to your PC and using some simple terminal software set to 115200-8-N-1 use the command line interface to the Raspberry Pi in the same way as if you we're using a keyboard and screen connected to it. However that's no use if you want to use the UART interface for your own application running on the RPi.
Turning off the UART functioning as a serial console
(This is based on Clayton Smiths nifty guide).
Backup the /boot/cmdline.txt file before you edit it just in case of screw-ups:
sudo cp /boot/cmdline.txt /boot/cmdline_backup.txt
Edit the file:
sudo vi /boot/cmdline.txt
Running "2012-09-18-wheezy-raspbian.img" the file contained the following:
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
Delete and parameters involving the serial port "ttyAMA0", which in this example is:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
Press ESC to return to the vi command mode and then type ":wq" (without the quotation marks) to save and exit (even if it appears vi is still in editing mode just type the ":wq" command). If you need to exit without saving type ":q".
You also need to edit this file:
sudo vi /etc/inittab
Search for the serial port usage by typing:
This should find the line of the file specifying the serial port (if there is one), move the cursor to the start of the line and press "i" to select insert and cursor and then press "#" to comment out the line. Then press ESC and enter ":wq" to save and exit.
Enter "sudo reboot" to restart the pi and now the UART will be available for another process to use it.
Using The UART In Your C Code
(This is based on the example code given here).
#include <unistd.h> //Used for UART
#include <fcntl.h> //Used for UART
#include <termios.h> //Used for UART
Setting Up The UART
//----- SETUP USART 0 -----
//At bootup, pins 8 and 10 are already set to UART0_TXD, UART0_RXD (ie the alt0 function) respectively
int uart0_filestream = -1;
//OPEN THE UART
//The flags (defined in fcntl.h):
// Access modes (use 1 of these):
// O_RDONLY - Open for reading only.
// O_RDWR - Open for reading and writing.
// O_WRONLY - Open for writing only.
// O_NDELAY / O_NONBLOCK (same function) - Enables nonblocking mode. When set read requests on the file can return immediately with a failure status
// if there is no input immediately available (instead of blocking). Likewise, write requests can also return
// immediately with a failure status if the output can't be written immediately.
// O_NOCTTY - When set and path identifies a terminal device, open() shall not cause the terminal device to become the controlling terminal for the process.
uart0_filestream = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY); //Open in non blocking read/write mode
if (uart0_filestream == -1)
//ERROR - CAN'T OPEN SERIAL PORT
printf("Error - Unable to open UART. Ensure it is not in use by another application\n");
//CONFIGURE THE UART
//The flags (defined in termios.h - see http://pubs.opengroup.org/onlinepubs/00 ... ios.h.html
// Baud rate:- B1200, B2400, B4800, B9600, B19200, B38400, B57600, B115200, B230400, B460800, B500000, B576000, B921600, B1000000, B1152000, B1500000, B2000000, B2500000, B3000000, B3500000, B4000000
// CSIZE:- CS5, CS6, CS7, CS8
// CLOCAL - Ignore modem status lines
// CREAD - Enable receiver
// IGNPAR = Ignore characters with parity errors
// ICRNL - Map CR to NL on input
// PARENB - Parity enable
// PARODD - Odd parity (else even)
struct termios options;
cfsetispeed(&options, B9600); //<Set baud rate
cfsetospeed(&options, B9600); //<Set baud rate
options.c_cflag = B9600 | CS8 | CLOCAL | CREAD; //<Set baud rate
options.c_iflag = IGNPAR | ICRNL;
options.c_oflag = 0;
tcsetattr(uart0_filestream, TCSANOW, &options);
//----- TX BYTES -----
unsigned char tx_buffer;
unsigned char *p_tx_buffer;
p_tx_buffer = &tx_buffer;
*p_tx_buffer++ = 'H';
*p_tx_buffer++ = 'e';
*p_tx_buffer++ = 'l';
*p_tx_buffer++ = 'l';
*p_tx_buffer++ = 'o';
if (uart0_filestream != -1)
int count = write(uart0_filestream, &tx_buffer, (p_tx_buffer - &tx_buffer)); //Filestream, bytes to write, number of bytes to write
if (count < 0)
printf("UART TX error\n");
//----- CHECK FOR ANY RX BYTES -----
if (uart0_filestream != -1)
// Read up to 255 characters from the port if they are there
unsigned char rx_buffer;
int rx_length = read(uart0_filestream, (void*)rx_buffer, 255); //Filestream, buffer to store in, number of bytes to read (max)
if (rx_length < 0)
//An error occured
printf("UART RX error\n");
else if (rx_length == 0)
//No data waiting
rx_buffer[rx_length] = '\0';
printf("%i bytes read : %s\n", rx_length, rx_buffer);
Closing the UART if no longer needed
//----- CLOSE THE UART -----
Using minicom on the UART
sudo apt-get install minicom
minicom -b 115200 -o -D /dev/ttyAMA0
To test the UART is working you can simply link the TX and RX pins to each other and verify minicom receives what you type.