跳转到内容

串口编程/termio

来自维基教科书,开放的书籍,为了一个开放的世界

<termio.h>(注意缺少 's') 是较旧的 System V 终端 I/O API。它已被<termios.h>在现代系统上取代。它在许多系统中仍然被使用,例如嵌入式 Unix 系统或基于 Unix System V 的系统。通常,现代系统也仍然提供旧的 API。

对串行设备的所有设置都是通过 ioctl(2) 系统调用完成的,而不是通过<termios.h>.

特殊字符

[编辑 | 编辑源代码]
  • INTR (默认 Ctrl-C 或 ASCII ETX)
  • QUIT (默认 Ctrl-\ 或 ASCII ES)
  • ERASE (默认退格键或 ASCII BS)
  • KILL (Ctrl-U 或 ASCII NAK)
  • EOF (Ctrl-D 或 ASCII EOT)
  • NL (ASCII LF)
  • EOL (ASCII LF)
  • STOP (Ctrl-S 或 ASCII DC3)
  • START (Ctrl-Q 或 ASCII DC1)

通过 Termio 设置和获取参数

[编辑 | 编辑源代码]
主要命令
[编辑 | 编辑源代码]

使用 termio 控制串行(终端)I/O 的主要命令都使用以下形式的 ioctl() 调用

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

以下命令使用此 ioctl() 形式

TCGETA
获取当前参数
#include <termio.h>
    :
    .
struct termio params;
ioctl(fileDescriptor, TCGETA, &params);
TCSETA
立即设置参数
TCSETAW
在输出为空时设置参数(等待更改,直到所有缓冲数据都被发送)。
TCSETAF
等待输出为空,然后刷新输入,然后设置参数。

struct termio参数在所有上述ioctl(2)命令中使用,如下所示

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 */
};


  • struct termio 中的 c_cc 数组
  • struct termio 中的 c_iflag 输入模式标志
    • IGNBRK
    • BRKINT
    • IGNPAR
    • PARMRK
    • INPCK
    • ISTRIP
    • INLCR
    • IGNCR
    • ICRNL
    • IUCLC
    • IXON
    • IXANY
    • IXOFF
  • struct termio 中的 c_oflag 输出模式标志
    • 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
  • struct termio 中的 c_cflag
    • B0, B50, B75, B110, B134, B150, B300, B600, B1200, B1800, B2400, B4800, B9600, B19200, B38400 用于选择波特率
    • CSIZE
    • CS5, CS6, CS7, CS8 用于设置数据位长度,介于 5..8 之间
    • CSTOPB
    • CREAD
    • PARENB 用于启用奇偶校验
    • PARODD 用于选择奇校验
    • HUPCL
    • CLOCAL
  • struct termio 中的 c_lflag
    • ISIG
    • ICANON
    • XCASE
    • ECHO
    • ECHOE
    • ECHOK
    • ECHONL
    • NOFLSH
附加命令
[编辑 | 编辑源代码]

附加命令使用以下形式的 ioctl() 调用

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

以下 termio 命令使用此形式

TCSBRK
等待输出为空(清空)。可选地,当发生这种情况时,可以发送一个断开连接。事实上,这是最常见的应用
#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); }
TCXONC
启动或停止输出。
#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); }


TCFLSH
刷新输入、输出或两个队列。
#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); }


请仅在书籍标题页中添加 {{alphabetical}}

华夏公益教科书