当前位置:嗨网首页>书籍在线阅读

09-线路设置用户空间接口

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

14.5.1 线路设置用户空间接口

用户可用如下两种方式改变tty设备的线路设置或者获取当前线路设置。

1.调用用户空间的termios库函数

用户空间的应用程序需引用termios.h头文件,该头文件包含了终端设备的I/O接口,实际是由POSIX定义的标准方法。对终端设备操作模式的描述由termios结构体完成,从代码清单14.2可以看出,这个结构体包含c_iflag、c_oflag、c_cflag、c_lflag和c_cc[]几个成员。

termios的c_cflag主要包含如下位域信息:CSIZE(字长)、CSTOPB(两个停止位)、PARENB(奇偶校验位使能)、PARODD(奇校验位,当PARENB被使能时)、CREAD(字符接收使能,如果没有置位,仍然从端口接收字符,但这些字符都要被丢弃)、CRTSCTS(如果被置位,使能CTS状态改变报告)、CLOCAL(如果没有置位,使能调制解调器状态改变报告)。

termios的c_iflag主要包含如下位域信息:INPCK(使能帧和奇偶校验错误检查)、BRKINT (break将清除终端输入/输出队列,向该终端上前台的程序发出SIGINT信号)、PARMRK(奇偶校验和帧错误被标记,在INPCK被设置且IGNPAR未被设置的情况下才有意义)、IGNPAR(忽略奇偶校验和帧错误)、IGNBRK(忽略break)。

通过tcgetattr()、tcsetattr()函数即可完成对终端设备的操作模式的设置和获取,这两个函数的原型如下:

int tcgetattr (int fd, struct termios *termios_p);

int tcsetattr (int fd, int optional_actions, struct termios *termios_p);

例如,Raw模式的线路设置如下。

● 非正规模式。

● 关闭回显。

● 禁止CR到NL的映射(ICRNL)、输入奇偶校验、输入第8位的截取(ISTRIP)以及输出流控制。

● 8位字符(CS8),奇偶校验被禁止。

● 禁止所有的输出处理。

● 每次一个字节(c_cc [VMIN] = 1、c_cc [VTIME] = 0)。

则对应的对termios结构体的设置就为:

termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP

| INLCR | IGNCR | ICRNL | IXON);

termios_p->c_oflag &= ~OPOST;

termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);

termios_p->c_cflag &= ~(CSIZE | PARENB);

termios_p->c_cflag |= CS8;

通过如下一组函数可完成输入/输出波特率的获取和设置:

speed_t cfgetospeed (struct termios *termios_p); //获得输出波特率

speed_t cfgetispeed (struct termios *termios_p); //获得输入波特率

int cfsetospeed (struct termios *termios_p, speed_t speed); //设置输出波特率

int cfsetispeed (struct termios *termios_p, speed_t speed); //设置输入波特率

如下一组函数则完成线路控制:

int tcdrain (int fd); //等待所有输出都被发送

int tcflush (int fd, int queue_selector); //flush输入/输出缓冲区

int tcflow (int fd, int action); //对输入和输出流进行控制

int tcsendbreak (int fd, int duration); //发送break

tcflush函数刷清(抛弃)输入缓冲区(终端驱动程序已接收到,但用户程序尚未读取)或输出缓冲区(用户程序已经写,但驱动尚未发送),queue参数可取TCIFLUSH(刷清输入队列)、TCOFLUSH(刷清输出队列)或TCIOFLUSH(刷清输入、输出队列)。

tcflow()对输入输出进行流控制,action参数可取TCOOFF(输出被挂起)、TCOON(重新启动以前被挂起的输出)、TCIOFF(发送1个STOP字符,使终端设备暂停发送数据)、TCION(发送1个START字符,使终端恢复发送数据)。

tcsendbreak()函数在一个指定的时间区间内发送连续的二进位数0。若duration参数为0,则此种发送延续0.25~0.5秒。POSIX.1说明若duration非0,则发送时间依赖于实现。

2.对tty设备节点进行ioctl()调用

大部分termios库函数会被转化为对tty设备节点的ioctl()调用,例如tcgetattr()、tcsetattr()函数对应着TCGETS、TCSETS IO控制命令。

TIOCMGET(获得MODEM状态位)、TIOCMSET(设置MODEM状态位)、TIOCMBIC(清除指示MODEM位)、TIOCMBIS(设置指示MODEM位)这4个I/O控制命令用于获取和设置MODEM握手,如RTS、CTS、DTR、DSR、RI、CD等。