Serial Programming/termio

From Wikibooks, open books for an open world
< Serial Programming
Jump to navigation Jump to search

Introduction[edit| edit source]

<termio.h> (note the missing 's') is the older System V terminal I/O API. It has been replaced by <termios.h> 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 <termios.h>.

Special Characters[edit| edit source]

  • 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)
  • STOP (Ctrl-S, or ASCII DC3)
  • START (Ctrl-Q, or ASCII DC1)

Setting and Getting Parameters via Termio[edit| edit source]

Primary commands[edit| edit source]

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:

Get current parameters
#include <termio.h>
struct termio params;
ioctl(fileDescriptor, TCGETA, &params);
Set parameters immediately
Set parameters when output is empty (waits with change until all buffered data has been sent).
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.
#define NCC 8
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 */

  • 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[edit| edit source]

The additional commands use the following form of ioctl() calls:

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

The following termio commands use this form:

Wait until output is empty (drain). Optionally, a break can be sent when this happens. In fact, this is the most common application
#include <termio.h>
/* Convenience macros for the waitBreak cmd argument */ #define WAIT_N_BREAK 0 #define WAIT_ONLY 1
/* * 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); }
Start or stop the output.
#include <termio.h>
/* Convenience macros for the start/stop cmd argument */ #define STOP 0 #define START 1
/* * 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); }

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

Please add {{alphabetical}} only to book title pages.