C Serial Port Example

Active2 months ago

I am a little bit confused about reading and writing to a serial port. I have a USB device in Linux that uses the FTDI USB serial device converter driver. When I plug it in, it creates: /dev/ttyUSB1.

I thought itd be simple to open and read/write from it in C. I know the baud rate and parity information, but it seems like there is no standard for this?

The serial ports are accessed through any version of Windows and Visual C by using a few system application interface (API) functions. An example of a short C function that accesses the serial ports is listed in Example 1. There is an easier way to deal with the serial port. In the toolbox under Componets you can drag a SerialPort component unto your form. Here is a tutorial in C#, should be not too difficult to adapt to C.NET. Sep 04, 2015  Serial-Port-Programming-on-Linux / USB2SERIALRead / Reciever (PC Side) / SerialPortread.c Find file Copy path xanthium-enterprises Serial.

Am I missing something, or can someone point me in the right direction?

jww
58.1k45 gold badges261 silver badges559 bronze badges
gnychisgnychis
2,39513 gold badges60 silver badges93 bronze badges

2 Answers

I wrote this a long time ago (from years 1985-1992, with just a few tweaks since then), and just copy and paste the bits needed into each project.

The values for speed are B115200, B230400, B9600, B19200, B38400, B57600, B1200, B2400, B4800, etc. The values for parity are 0 (meaning no parity), PARENB|PARODD (enable parity and use odd), PARENB (enable parity and use even), PARENB|PARODD|CMSPAR (mark parity), and PARENB|CMSPAR (space parity).

'Blocking' sets whether a read() on the port waits for the specified number of characters to arrive. Setting no blocking means that a read() returns however many characters are available without waiting for more, up to the buffer limit.

Addendum:

CMSPAR is needed only for choosing mark and space parity, which is uncommon. For most applications, it can be omitted. My header file /usr/include/bits/termios.h enables definition of CMSPAR only if the preprocessor symbol __USE_MISC is defined. That definition occurs (in features.h) with

The introductory comments of <features.h> says:

Gabriel Staples
3,3253 gold badges21 silver badges49 bronze badges
wallykwallyk
50k10 gold badges68 silver badges125 bronze badges

For demo code that conforms to POSIX standard as described in Setting Terminal Modes Properlyand Serial Programming Guide for POSIX Operating Systems, the following is offered.
It's essentially derived from the other answer, but inaccurate and misleading comments have been corrected.

To make the program treat the received data as ASCII codes, compile the program with the symbol DISPLAY_STRING, e.g.

If the received data is ASCII text (rather than binary data) and you want to read it as lines terminated by the newline character, then see this answer for a sample program.

sawdustsawdust
11.3k1 gold badge27 silver badges40 bronze badges
Serial

protected by user405725 Jan 24 '13 at 20:53

Linux Serial Port C Code Example

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).
Would you like to answer one of these unanswered questions instead?

C# Serial Port

Not the answer you're looking for? Browse other questions tagged clinuxserial-port or ask your own question.

PermalinkC Serial Port Example

Join GitHub today

GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.

Sign up
Find file Copy path

Visual Studio C# Serial Port Example

xanthium-enterprisesSerial Programming on Linux V1.07865c54Sep 4, 2015

Visual Studio C Serial Port Example

1 contributor

C Sharp Com Port Example

Serial
/**/
/* Serial Port Programming in C (Serial Port Read) */
/* Non Cannonical mode */
/*----------------------------------------------------------------------------------------------------*/
/* Program reads a string from the serial port at 9600 bps 8N1 format */
/* Baudrate - 9600 */
/* Stop bits -1 */
/* No Parity */
/*----------------------------------------------------------------------------------------------------*/
/* Compiler/IDE : gcc 4.6.3 */
/* Library : */
/* Commands : gcc -o serialport_read serialport_read.c */
/* OS : Linux(x86) (Linux Mint 13 Maya)(Linux Kernel 3.x.x) */
/* Programmer : Rahul.S */
/* Date : 21-December-2014 */
/**/
/**/
/* www.xanthium.in */
/* Copyright (C) 2014 Rahul.S */
/**/
/**/
/* Running the executable */
/* ---------------------------------------------------------------------------------------------------*/
/* 1) Compile the serialport_read.c file using gcc on the terminal (without quotes) */
/**/
/* ' gcc -o serialport_read serialport_read.c ' */
/**/
/* 2) Linux will not allow you to access the serial port from user space,you have to be root.So use */
/* 'sudo' command to execute the compiled binary as super user. */
/**/
/* 'sudo ./serialport_read' */
/**/
/**/
/**/
/* Sellecting the Serial port Number on Linux */
/* ---------------------------------------------------------------------------------------------------*/
/* /dev/ttyUSBx - when using USB to Serial Converter, where x can be 0,1,2...etc */
/* /dev/ttySx - for PC hardware based Serial ports, where x can be 0,1,2...etc */
/**/
/*-------------------------------------------------------------*/
/* termios structure - /usr/include/asm-generic/termbits.h */
/* use 'man termios' to get more info about termios structure */
/*-------------------------------------------------------------*/
#include<stdio.h>
#include<fcntl.h>/* File Control Definitions */
#include<termios.h>/* POSIX Terminal Control Definitions */
#include<unistd.h>/* UNIX Standard Definitions */
#include<errno.h>/* ERROR Number Definitions */
voidmain(void)
{
int fd;/*File Descriptor*/
printf('n +----------------------------------+');
printf('n | Serial Port Read |');
printf('n +----------------------------------+');
/*------------------------------- Opening the Serial Port -------------------------------*/
/* Change /dev/ttyUSB0 to the one corresponding to your system */
fd = open('/dev/ttyUSB0',O_RDWR | O_NOCTTY); /* ttyUSB0 is the FT232 based USB2SERIAL Converter */
/* O_RDWR - Read/Write access to serial port */
/* O_NOCTTY - No terminal will control the process */
/* Open in blocking mode,read will wait */
if(fd -1) /* Error Checking */
printf('n Error! in Opening ttyUSB0 ');
else
printf('n ttyUSB0 Opened Successfully ');
/*---------- Setting the Attributes of the serial port using termios structure --------- */
struct termios SerialPortSettings; /* Create the structure */
tcgetattr(fd, &SerialPortSettings); /* Get the current attributes of the Serial port */
/* Setting the Baud rate */
cfsetispeed(&SerialPortSettings,B9600); /* Set Read Speed as 9600 */
cfsetospeed(&SerialPortSettings,B9600); /* Set Write Speed as 9600 */
/* 8N1 Mode */
SerialPortSettings.c_cflag &= ~PARENB; /* Disables the Parity Enable bit(PARENB),So No Parity */
SerialPortSettings.c_cflag &= ~CSTOPB; /* CSTOPB = 2 Stop bits,here it is cleared so 1 Stop bit */
SerialPortSettings.c_cflag &= ~CSIZE; /* Clears the mask for setting the data size */
SerialPortSettings.c_cflag |= CS8; /* Set the data bits = 8 */
SerialPortSettings.c_cflag &= ~CRTSCTS; /* No Hardware flow Control */
SerialPortSettings.c_cflag |= CREAD | CLOCAL; /* Enable receiver,Ignore Modem Control lines */
SerialPortSettings.c_iflag &= ~(IXON | IXOFF | IXANY); /* Disable XON/XOFF flow control both i/p and o/p */
SerialPortSettings.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG); /* Non Cannonical mode */
SerialPortSettings.c_oflag &= ~OPOST;/*No Output Processing*/
/* Setting Time outs */
SerialPortSettings.c_cc[VMIN] = 10; /* Read at least 10 characters */
SerialPortSettings.c_cc[VTIME] = 0; /* Wait indefinetly */
if((tcsetattr(fd,TCSANOW,&SerialPortSettings)) != 0) /* Set the attributes to the termios structure*/
printf('n ERROR ! in Setting attributes');
else
printf('n BaudRate = 9600 n StopBits = 1 n Parity = none');
/*------------------------------- Read data from serial port -----------------------------*/
tcflush(fd, TCIFLUSH); /* Discards old data in the rx buffer */
char read_buffer[32]; /* Buffer to store the data received */
int bytes_read = 0; /* Number of bytes read by the read() system call */
int i = 0;
bytes_read = read(fd,&read_buffer,32); /* Read the data */
printf('nn Bytes Rxed -%d', bytes_read); /* Print the number of bytes read */
printf('nn');
for(i=0;i<bytes_read;i++) /*printing only the received characters*/
printf('%c',read_buffer[i]);
printf('n +----------------------------------+nnn');
close(fd); /* Close the serial port */
}
  • Copy lines
  • Copy permalink