Serial Programming/termio

Introduction
 (note the missing 's') is the older System V terminal I/O API. It has been replaced by  on modern systems. It is still in use on many systems, e.g. on embedded Unix systems or those based on Unix System V. Often modern systems still also provide the old API, too.

All settings to a serial device are done via the ioctl(2) system call, as opposite to the special functions as provided by .

Special Characters

 * INTR (default Ctrl-C or ASCII ETX)
 * QUIT (default Ctrl-\, or ASCII ES)
 * ERASE (default backspace or ASCII BS)
 * KILL (Ctrl-U, or ASCII NAK)
 * EOF (Ctrl-D, or ASCII EOT)
 * NL (ASCII LF)
 * EOL (ASCII LF)
 * STOP (Ctrl-S, or ASCII DC3)
 * START (Ctrl-Q, or ASCII DC1)

Primary commands
The main commands for controlling serial (terminal) I/O with termio all use an ioctl call of the form

ioctl(int fileDescriptor, int termioCommand, struct termio *arg);

The following commands use this ioctl form:


 * TCGETA
 * Get current parameters

ioctl(fileDescriptor, TCGETA, &params);
 * 1) include 


 * TCSETA
 * Set parameters immediately


 * TCSETAW
 * Set parameters when output is empty (waits with change until all buffered data has been sent).


 * TCSETAF
 * Wait until output is empty, then flush input, then set parameters.

The struct termio argument as used in all the above ioctl(2) command looks as it follows:


 * struct termio

/* * Classic struct termio. More modern Unix versions * contain additional information. Unix versions who * support termio and termios often use the same * structure for termio and termios, so termio * contains the full termios data on this systems. */ struct termio { int c_iflag;	 /* input modes	 */ int c_oflag;	 /* output modes */ int c_cflag;	 /* control modes */ int c_lflag;	 /* local modes	 */ char c_cc[NCC];	 /* control chars */ };
 * 1) define NCC 8


 * c_cc array in struct termio
 * c_iflag input mode flag in struct termio
 * IGNBRK
 * BRKINT
 * IGNPAR
 * PARMRK
 * INPCK
 * ISTRIP
 * INLCR
 * IGNCR
 * ICRNL
 * IUCLC
 * IXON
 * IXANY
 * IXOFF
 * c_oflag output mode flag in struct termio
 * OPOST
 * OLCUC
 * ONLCR
 * OCRNL
 * ONOCR
 * ONLRET
 * OFILL
 * OFDEL
 * NLDLY
 * NL0
 * NL1
 * CRDLY
 * CR0
 * CR1
 * CR2
 * CR3
 * TABDLY
 * TAB0
 * TAB1
 * TAB2
 * TAB3
 * BSDLY
 * BS0
 * BS1
 * VTDLY
 * VT0
 * VT1
 * FFDLY
 * FF0
 * FF1
 * c_cflag in struct termio
 * B0, B50, B75, B110, B134, B150, B300, B600, B1200, B1800, B2400, B4800, B9600, B19200, B38400 This are to select baud rate
 * CSIZE
 * CS5, CS6, CS7, CS8 These are for setting data bit length, between 5..8
 * CSTOPB
 * CREAD
 * PARENB This is for enabling parity check
 * PARODD This is to select odd parity
 * HUPCL
 * CLOCAL
 * c_lflag in struct termio
 * ISIG
 * ICANON
 * XCASE
 * ECHO
 * ECHOE
 * ECHOK
 * ECHONL
 * NOFLSH

Additional Commands
The additional commands use the following form of ioctl calls:

ioctl(int fileDescriptor, int termioCommand, int arg);

The following termio commands use this form:


 * TCSBRK
 * Wait until output is empty (drain). Optionally, a break can be sent when this happens. In fact, this is the most common application

/* Convenience macros for the waitBreak cmd argument */ /* * Function for waiting until output is empty and opt. sending a break */ tcWaitBreak(int fileDescriptor, int cmd) { ioctl(fileDescriptor, TCSBRK, cmd); } /*  * Send break when output is empty */ tcBreak(int fileDescriptor) { tcWaitBreak(fileDescriptor, WAIT_N_BREAK); }
 * 1) include 
 * 1) define WAIT_N_BREAK 0
 * 2) define WAIT_ONLY    1


 * TCXONC
 * Start or stop the output.

/* Convenience macros for the start/stop cmd argument */ /* * Function for starting /stopping output */ tcStartStop(int fileDescriptor, int cmd) { ioctl(fileDescriptor, TCXONC, cmd); } /*  * stop output */ tcStop(int fileDescriptor) { tcStartStop(fileDescriptor, STOP); } /*  * start output */ tcStart(int fileDescriptor) { tcStartStop(fileDescriptor, START); }
 * 1) include 
 * 1) define STOP 0
 * 2) define START 1


 * TCFLSH
 * Flush the input, output, or both queues.

/* Convenience macros for the flush cmd argument */ /* * Function for flushing a terminal/serial device */ tcFlush(int fileDescriptor, int cmd) { ioctl(fileDescriptor, TCFLSH, cmd); }
 * 1) include <termio.h>
 * 1) define FLUSH_IN  0
 * 2) define FLUSH_OUT 1
 * 3) define FLUSH_BOTH 2