虽然大多数终端设备对输入和输出都使用同一波特率(即“位/秒”),但只要硬件允许,就可以使用下面 4 个函数将它们设置为不同的值。
其中,两个 cfget 函数的返回值,以及两个 cfset 函数的 speed 参数都是下列常量之一:B50、B75、B110、B134、B150、B200、B300、B600、B1200、B1800、B2400、B4800、B9600、B19200 或 B38400(多数系统还定义了另外的波特率值)。常量 B0 表示“挂断”。在调用 tcsetattr 时,如若将输出波特率指定为 B0,则调制解调器的控制线就不再起作用。
另外,使用这些函数时,必须认识到输入、输出波特率是存储在设备的 termios 结构中的。在调用任意一个 cfget 函数之前,要先用 tcgetattr 函数获得设备的 termios 结构。同理,在调用任意一个 cfset 函数后,还应当调用 tcsetattr 函数来使这种更改影响到设备。不过即使所设置的两个波特率中的任意一个出错,在调用 tcsetattr 之前可能也不会发现该错误。
下列 4 个函数提供了终端设备的行控制能力。它们都要求参数 fd 引用一个终端设备,否则出错返回 -1,并将 errno 设置为 ENOTTY。
tcdrain 函数等待所有输出都被传递。
tcflow 函数用于对输入和输出流控制进行控制。action 参数是下列 4 个值之一。
* TCOOFF:输出被挂起。
* TCOON:重新启动以前被挂起的输出。
* TCIOFF:系统发送一个 STOP 字符,这将使终端设备停止发送数据。
* TCION:系统发送一个 START 字符,使终端设备恢复发送数据。
tcflush 函数冲洗(抛弃)输入缓冲区(其中的数据是终端驱动程序已接收到,但用户程序尚未读取的)或输出缓冲区(其中的数据是用户程序已经写入,但尚未被传递的)。queue 参数是下列 3 个常量之一。
* TCIFLUSH:冲洗输入队列。
* TCOFLUSH:冲洗输出队列。
* TCIOFLUSH:冲洗输入和输出队列。
tcsendbreak 函数在一个指定的时间区间内发送连续的 0 值位流。若 duration 参数为 0,则此种传递延续 0.25~0.5 秒。POSIX.1 说明若 duration 非 0,则传递时间依赖于实现。
#include <termios.h>
speed_t cfgetispeed(const struct termios *termptr);
speed_t cfgetospeed(const struct termios *termptr);
/* 两个函数的返回值:波特率值 */
int cfsetispeed(struct termios *termptr, speed_t speed);
int cfsetospeed(struct termios *termptr, speed_t speed);
/* 两个函数的返回值:若成功,返回 0;否则,返回 -1 */
其中,两个 cfget 函数的返回值,以及两个 cfset 函数的 speed 参数都是下列常量之一:B50、B75、B110、B134、B150、B200、B300、B600、B1200、B1800、B2400、B4800、B9600、B19200 或 B38400(多数系统还定义了另外的波特率值)。常量 B0 表示“挂断”。在调用 tcsetattr 时,如若将输出波特率指定为 B0,则调制解调器的控制线就不再起作用。
另外,使用这些函数时,必须认识到输入、输出波特率是存储在设备的 termios 结构中的。在调用任意一个 cfget 函数之前,要先用 tcgetattr 函数获得设备的 termios 结构。同理,在调用任意一个 cfset 函数后,还应当调用 tcsetattr 函数来使这种更改影响到设备。不过即使所设置的两个波特率中的任意一个出错,在调用 tcsetattr 之前可能也不会发现该错误。
下列 4 个函数提供了终端设备的行控制能力。它们都要求参数 fd 引用一个终端设备,否则出错返回 -1,并将 errno 设置为 ENOTTY。
#include <termios.h>
int tcdrain(int fd);
int tcflow(int fd, int action);
int tcflush(int fd, int queue);
int tcsendbreak(int fd, int duration);
/* 四个函数的返回值:若成功,返回 0;否则,返回 -1 */
tcdrain 函数等待所有输出都被传递。
tcflow 函数用于对输入和输出流控制进行控制。action 参数是下列 4 个值之一。
* TCOOFF:输出被挂起。
* TCOON:重新启动以前被挂起的输出。
* TCIOFF:系统发送一个 STOP 字符,这将使终端设备停止发送数据。
* TCION:系统发送一个 START 字符,使终端设备恢复发送数据。
tcflush 函数冲洗(抛弃)输入缓冲区(其中的数据是终端驱动程序已接收到,但用户程序尚未读取的)或输出缓冲区(其中的数据是用户程序已经写入,但尚未被传递的)。queue 参数是下列 3 个常量之一。
* TCIFLUSH:冲洗输入队列。
* TCOFLUSH:冲洗输出队列。
* TCIOFLUSH:冲洗输入和输出队列。
tcsendbreak 函数在一个指定的时间区间内发送连续的 0 值位流。若 duration 参数为 0,则此种传递延续 0.25~0.5 秒。POSIX.1 说明若 duration 非 0,则传递时间依赖于实现。