1 #ifndef _TERMIOS_H 2 #define _TERMIOS_H 3 4 #define TTY_BUF_SIZE 1024 // tty 中的缓冲区长度。 5 6 /* 0x54 is just a magic number to make these relatively uniqe ('T') */ 7 /* 0x54 只是一个模数,目的是为了使这些常数唯一('T') */ 8 9 // tty 设备的ioctl 调用命令集。ioctl 将命令编码在低位字中。 10 // 下面名称TC[*]的含义是tty 控制命令。 11 // 取相应终端termios 结构中的信息(参见tcgetattr())。 12 #define TCGETS 0x5401 13 // 设置相应终端termios 结构中的信息(参见tcsetattr(),TCSANOW)。 14 #define TCSETS 0x5402 15 // 在设置终端termios 的信息之前,需要先等待输出队列中所有数据处理完(耗尽)。对于修改参数 16 // 会影响输出的情况,就需要使用这种形式(参见tcsetattr(),TCSADRAIN 选项)。 17 #define TCSETSW 0x5403 18 // 在设置termios 的信息之前,需要先等待输出队列中所有数据处理完,并且刷新(清空)输入队列。 19 // 再设置(参见tcsetattr(),TCSAFLUSH 选项)。 20 #define TCSETSF 0x5404 21 // 取相应终端termio 结构中的信息(参见tcgetattr())。 22 #define TCGETA 0x5405 23 // 设置相应终端termio 结构中的信息(参见tcsetattr(),TCSANOW 选项)。 24 #define TCSETA 0x5406 25 // 在设置终端termio 的信息之前,需要先等待输出队列中所有数据处理完(耗尽)。对于修改参数 26 // 会影响输出的情况,就需要使用这种形式(参见tcsetattr(),TCSADRAIN 选项)。 27 #define TCSETAW 0x5407 28 // 在设置termio 的信息之前,需要先等待输出队列中所有数据处理完,并且刷新(清空)输入队列。 29 // 再设置(参见tcsetattr(),TCSAFLUSH 选项)。 30 #define TCSETAF 0x5408 31 // 等待输出队列处理完毕(空),如果参数值是0,则发送一个break(参见tcsendbreak(),tcdrain())。 32 #define TCSBRK 0x5409 33 // 开始/停止控制。如果参数值是0,则挂起输出;如果是1,则重新开启挂起的输出;如果是2,则挂起 34 // 输入;如果是3,则重新开启挂起的输入(参见tcflow())。 35 #define TCXONC 0x540A 36 //刷新已写输出但还没发送或已收但还没有读数据。如果参数是0,则刷新(清空)输入队列;如果是1, 37 // 则刷新输出队列;如果是2,则刷新输入和输出队列(参见tcflush())。 38 #define TCFLSH 0x540B 39 // 下面名称TIOC[*]的含义是tty 输入输出控制命令。 40 // 设置终端串行线路专用模式。 41 #define TIOCEXCL 0x540C 42 // 复位终端串行线路专用模式。 43 #define TIOCNXCL 0x540D 44 // 设置tty 为控制终端。(TIOCNOTTY - 禁止tty 为控制终端)。 45 #define TIOCSCTTY 0x540E 46 // 读取指定终端设备进程的组id(参见tcgetpgrp())。 47 #define TIOCGPGRP 0x540F 48 // 设置指定终端设备进程的组id(参见tcsetpgrp())。 49 #define TIOCSPGRP 0x5410 50 // 返回输出队列中还未送出的字符数。 51 #define TIOCOUTQ 0x5411 52 // 模拟终端输入。该命令以一个指向字符的指针作为参数,并假装该字符是在终端上键入的。用户必须 53 // 在该控制终端上具有超级用户权限或具有读许可权限。 54 #define TIOCSTI 0x5412 55 // 读取终端设备窗口大小信息(参见winsize 结构)。 56 #define TIOCGWINSZ 0x5413 57 // 设置终端设备窗口大小信息(参见winsize 结构)。 58 #define TIOCSWINSZ 0x5414 59 // 返回modem 状态控制引线的当前状态比特位标志集(参见下面185-196 行)。 60 #define TIOCMGET 0x5415 61 // 设置单个modem 状态控制引线的状态(true 或false)(Individual control line Set)。 62 #define TIOCMBIS 0x5416 63 // 复位单个modem 状态控制引线的状态(Individual control line clear)。 64 #define TIOCMBIC 0x5417 65 // 设置modem 状态引线的状态。如果某一比特位置位,则modem 对应的状态引线将置为有效。 66 #define TIOCMSET 0x5418 67 // 读取软件载波检测标志(1 - 开启;0 - 关闭)。 68 // 对于本地连接的终端或其它设备,软件载波标志是开启的,对于使用modem 线路的终端或设备则 69 // 是关闭的。为了能使用这两个ioctl 调用,tty 线路应该是以O_NDELAY 方式打开的,这样open() 70 // 就不会等待载波。 71 #define TIOCGSOFTCAR 0x5419 72 // 设置软件载波检测标志(1 - 开启;0 - 关闭)。 73 #define TIOCSSOFTCAR 0x541A 74 // 返回输入队列中还未取走字符的数目。 75 #define TIOCINQ 0x541B 76 77 // 窗口大小(Window size)属性结构。在窗口环境中可用于基于屏幕的应用程序。 78 // ioctls 中的TIOCGWINSZ 和TIOCSWINSZ 可用来读取或设置这些信息。 79 struct winsize 80 { 81 unsigned short ws_row; // 窗口字符行数。 82 unsigned short ws_col; // 窗口字符列数。 83 unsigned short ws_xpixel; // 窗口宽度,象素值。 84 unsigned short ws_ypixel; // 窗口高度,象素值。 85 }; 86 87 // AT&T 系统V 的termio 结构。 88 #define NCC 8 // termio 结构中控制字符数组的长度。 89 struct termio 90 { 91 unsigned short c_iflag; /* input mode flags */// 输入模式标志。 92 unsigned short c_oflag; /* output mode flags */// 输出模式标志。 93 unsigned short c_cflag; /* control mode flags */// 控制模式标志。 94 unsigned short c_lflag; /* local mode flags */// 本地模式标志。 95 unsigned char c_line; /* line discipline */// 线路规程(速率)。 96 unsigned char c_cc[NCC]; /* control characters */// 控制字符数组。 97 }; 98 99 // POSIX 的termios 结构。 100 #define NCCS 17 // termios 结构中控制字符数组的长度。 101 struct termios 102 { 103 unsigned long c_iflag; /* input mode flags */// 输入模式标志。 104 unsigned long c_oflag; /* output mode flags */// 输出模式标志。 105 unsigned long c_cflag; /* control mode flags */// 控制模式标志。 106 unsigned long c_lflag; /* local mode flags */// 本地模式标志。 107 unsigned char c_line; /* line discipline */// 线路规程(速率)。 108 unsigned char c_cc[NCCS]; /* control characters */// 控制字符数组。 109 }; 110 111 /* c_cc characters *//* c_cc 数组中的字符 */ 112 // 以下是c_cc 数组对应字符的索引值。 113 #define VINTR 0 // c_cc[VINTR] = INTR (^C),/003,中断字符。 114 #define VQUIT 1 // c_cc[VQUIT] = QUIT (^/),/034,退出字符。 115 #define VERASE 2 // c_cc[VERASE] = ERASE (^H),/177,擦出字符。 116 #define VKILL 3 // c_cc[VKILL] = KILL (^U),/025,终止字符。 117 #define VEOF 4 // c_cc[VEOF] = EOF (^D),/004,文件结束字符。 118 #define VTIME 5 // c_cc[VTIME] = TIME (/0),/0, 定时器值(参见后面说明)。 119 #define VMIN 6 // c_cc[VMIN] = MIN (/1),/1, 定时器值。 120 #define VSWTC 7 // c_cc[VSWTC] = SWTC (/0),/0, 交换字符。 121 #define VSTART 8 // c_cc[VSTART] = START (^Q),/021,开始字符。 122 #define VSTOP 9 // c_cc[VSTOP] = STOP (^S),/023,停止字符。 123 #define VSUSP 10 // c_cc[VSUSP] = SUSP (^Z),/032,挂起字符。 124 #define VEOL 11 // c_cc[VEOL] = EOL (/0),/0, 行结束字符。 125 #define VREPRINT 12 // c_cc[VREPRINT] = REPRINT (^R),/022,重显示字符。 126 #define VDISCARD 13 // c_cc[VDISCARD] = DISCARD (^O),/017,丢弃字符。 127 #define VWERASE 14 // c_cc[VWERASE] = WERASE (^W),/027,单词擦除字符。 128 #define VLNEXT 15 // c_cc[VLNEXT] = LNEXT (^V),/026,下一行字符。 129 #define VEOL2 16 // c_cc[VEOL2] = EOL2 (/0),/0, 行结束2。 130 131 /* c_iflag bits *//* c_iflag 比特位 */ 132 // termios 结构输入模式字段c_iflag 各种标志的符号常数。 133 #define IGNBRK 0000001 // 输入时忽略BREAK 条件。 134 #define BRKINT 0000002 // 在BREAK 时产生SIGINT 信号。 135 #define IGNPAR 0000004 // 忽略奇偶校验出错的字符。 136 #define PARMRK 0000010 // 标记奇偶校验错。 137 #define INPCK 0000020 // 允许输入奇偶校验。 138 #define ISTRIP 0000040 // 屏蔽字符第8 位。 139 #define INLCR 0000100 // 输入时将换行符NL 映射成回车符CR。 140 #define IGNCR 0000200 // 忽略回车符CR。 141 #define ICRNL 0000400 // 在输入时将回车符CR 映射成换行符NL。 142 #define IUCLC 0001000 // 在输入时将大写字符转换成小写字符。 143 #define IXON 0002000 // 允许开始/停止(XON/XOFF)输出控制。 144 #define IXANY 0004000 // 允许任何字符重启输出。 145 #define IXOFF 0010000 // 允许开始/停止(XON/XOFF)输入控制。 146 #define IMAXBEL 0020000 // 输入队列满时响铃。 147 148 /* c_oflag bits *//* c_oflag 比特位 */ 149 // termios 结构中输出模式字段c_oflag 各种标志的符号常数。 150 #define OPOST 0000001 // 执行输出处理。 151 #define OLCUC 0000002 // 在输出时将小写字符转换成大写字符。 152 #define ONLCR 0000004 // 在输出时将换行符NL 映射成回车-换行符CR-NL。 153 #define OCRNL 0000010 // 在输出时将回车符CR 映射成换行符NL。 154 #define ONOCR 0000020 // 在0 列不输出回车符CR。 155 #define ONLRET 0000040 // 换行符NL 执行回车符的功能。 156 #define OFILL 0000100 // 延迟时使用填充字符而不使用时间延迟。 157 #define OFDEL 0000200 // 填充字符是ASCII 码DEL。如果未设置,则使用ASCII NULL。 158 #define NLDLY 0000400 // 选择换行延迟。 159 #define NL0 0000000 // 换行延迟类型0。 160 #define NL1 0000400 // 换行延迟类型1。 161 #define CRDLY 0003000 // 选择回车延迟。 162 #define CR0 0000000 // 回车延迟类型0。 163 #define CR1 0001000 // 回车延迟类型1。 164 #define CR2 0002000 // 回车延迟类型2。 165 #define CR3 0003000 // 回车延迟类型3。 166 #define TABDLY 0014000 // 选择水平制表延迟。 167 #define TAB0 0000000 // 水平制表延迟类型0。 168 #define TAB1 0004000 // 水平制表延迟类型1。 169 #define TAB2 0010000 // 水平制表延迟类型2。 170 #define TAB3 0014000 // 水平制表延迟类型3。 171 #define XTABS 0014000 // 将制表符TAB 换成空格,该值表示空格数。 172 #define BSDLY 0020000 // 选择退格延迟。 173 #define BS0 0000000 // 退格延迟类型0。 174 #define BS1 0020000 // 退格延迟类型1。 175 #define VTDLY 0040000 // 纵向制表延迟。 176 #define VT0 0000000 // 纵向制表延迟类型0。 177 #define VT1 0040000 // 纵向制表延迟类型1。 178 #define FFDLY 0040000 // 选择换页延迟。 179 #define FF0 0000000 // 换页延迟类型0。 180 #define FF1 0040000 // 换页延迟类型1。 181 182 /* c_cflag bit meaning *//* c_cflag 比特位的含义 */ 183 // termios 结构中控制模式标志字段c_cflag 标志的符号常数(8 进制数)。 184 #define CBAUD 0000017 // 传输速率位屏蔽码。 185 #define B0 0000000 /* hang up */ /* 挂断线路 */ 186 #define B50 0000001 // 波特率 50。 187 #define B75 0000002 // 波特率 75。 188 #define B110 0000003 // 波特率 110。 189 #define B134 0000004 // 波特率 134。 190 #define B150 0000005 // 波特率 150。 191 #define B200 0000006 // 波特率 200。 192 #define B300 0000007 // 波特率 300。 193 #define B600 0000010 // 波特率 600。 194 #define B1200 0000011 // 波特率 1200。 195 #define B1800 0000012 // 波特率 1800。 196 #define B2400 0000013 // 波特率 2400。 197 #define B4800 0000014 // 波特率 4800。 198 #define B9600 0000015 // 波特率 9600。 199 #define B19200 0000016 // 波特率 19200。 200 #define B38400 0000017 // 波特率 38400。 201 #define EXTA B19200 // 扩展波特率A。 202 #define EXTB B38400 // 扩展波特率B。 203 #define CSIZE 0000060 // 字符位宽度屏蔽码。 204 #define CS5 0000000 // 每字符5 比特位。 205 #define CS6 0000020 // 每字符6 比特位。 206 #define CS7 0000040 // 每字符7 比特位。 207 #define CS8 0000060 // 每字符8 比特位。 208 #define CSTOPB 0000100 // 设置两个停止位,而不是1 个。 209 #define CREAD 0000200 // 允许接收。 210 #define CPARENB 0000400 // 开启输出时产生奇偶位、输入时进行奇偶校验。 211 #define CPARODD 0001000 // 输入/输入校验是奇校验。 212 #define HUPCL 0002000 // 最后进程关闭后挂断。 213 #define CLOCAL 0004000 // 忽略调制解调器(modem)控制线路。 214 #define CIBAUD 03600000 //input baud rate (not used) /* 输入波特率(未使用) */ 215 #define CRTSCTS 020000000000 /* flow control */ /* 流控制 */ 216 217 #define PARENB CPARENB // 开启输出时产生奇偶位、输入时进行奇偶校验。 218 #define PARODD CPARODD // 输入/输入校验是奇校验。 219 220 /* c_lflag bits *//* c_lflag 比特位 */ 221 // termios 结构中本地模式标志字段c_lflag 的符号常数。 222 #define ISIG 0000001 // 当收到字符INTR、QUIT、SUSP 或DSUSP,产生相应的信号。 223 #define ICANON 0000002 // 开启规范模式(熟模式,行模式、行缓冲模式,(遇到换行符号就就接受数据,否则只是缓冲))。 224 #define XCASE 0000004 // 若设置了ICANON,则终端是大写字符的。 225 #define ECHO 0000010 // 回显输入字符。 226 #define ECHOE 0000020 // 若设置了ICANON,则ERASE/WERASE 将擦除前一字符/单词。 227 #define ECHOK 0000040 // 若设置了ICANON,则KILL 字符将擦除当前行。 228 #define ECHONL 0000100 // 如设置了ICANON,则即使ECHO 没有开启也回显NL 字符。 229 #define NOFLSH 0000200 // 当生成SIGINT 和SIGQUIT 信号时不刷新输入输出队列,当 230 // 生成SIGSUSP 信号时,刷新输入队列。 231 #define TOSTOP 0000400 // 发送SIGTTOU 信号到后台进程的进程组,该后台进程试图写 232 // 自己的控制终端。 233 #define ECHOCTL 0001000 // 若设置了ECHO,则除TAB、NL、START 和STOP 以外的ASCII 234 // 控制信号将被回显成象^X 式样,X 值是控制符+0x40。 235 #define ECHOPRT 0002000 // 若设置了ICANON 和IECHO,则字符在擦除时将显示。 236 #define ECHOKE 0004000 // 若设置了ICANON,则KILL 通过擦除行上的所有字符被回显。 237 #define FLUSHO 0010000 // 输出被刷新。通过键入DISCARD 字符,该标志被翻转。 238 #define PENDIN 0040000 // 当下一个字符是读时,输入队列中的所有字符将被重显。 239 #define IEXTEN 0100000 // 开启实现时定义的输入处理。 240 241 /* modem lines *//* modem 线路信号符号常数 */ 242 #define TIOCM_LE 0x001 // 线路允许(Line Enable)。 243 #define TIOCM_DTR 0x002 // 数据终端就绪(Data Terminal Ready)。 244 #define TIOCM_RTS 0x004 // 请求发送(Request to Send)。 245 #define TIOCM_ST 0x008 // 串行数据发送(Serial Transfer)。[??] 246 #define TIOCM_SR 0x010 // 串行数据接收(Serial Receive)。[??] 247 #define TIOCM_CTS 0x020 // 清除发送(Clear To Send)。 248 #define TIOCM_CAR 0x040 // 载波监测(Carrier Detect)。 249 #define TIOCM_RNG 0x080 // 响铃指示(Ring indicate)。 250 #define TIOCM_DSR 0x100 // 数据设备就绪(Data Set Ready)。 251 #define TIOCM_CD TIOCM_CAR 252 #define TIOCM_RI TIOCM_RNG 253 254 /* tcflow() and TCXONC use these *//* tcflow()和TCXONC 使用这些符号常数 */ 255 #define TCOOFF 0 // 挂起输出。 256 #define TCOON 1 // 重启被挂起的输出。 257 #define TCIOFF 2 // 系统传输一个STOP 字符,使设备停止向系统传输数据。 258 #define TCION 3 // 系统传输一个START 字符,使设备开始向系统传输数据。 259 260 /* tcflush() and TCFLSH use these *//* tcflush()和TCFLSH 使用这些符号常数 */ 261 #define TCIFLUSH 0 // 清接收到的数据但不读。 262 #define TCOFLUSH 1 // 清已写的数据但不传送。 263 #define TCIOFLUSH 2 // 清接收到的数据但不读。清已写的数据但不传送。 264 265 /* tcsetattr uses these *//* tcsetattr()使用这些符号常数 */ 266 #define TCSANOW 0 // 改变立即发生。 267 #define TCSADRAIN 1 // 改变在所有已写的输出被传输之后发生。 268 #define TCSAFLUSH 2 // 改变在所有已写的输出被传输之后并且在所有接收到但 269 // 还没有读取的数据被丢弃之后发生。 270 271 typedef int speed_t; // 波特率数值类型。 272 273 // 返回termios_p 所指termios 结构中的接收波特率。 274 extern speed_t cfgetispeed (struct termios *termios_p); 275 // 返回termios_p 所指termios 结构中的发送波特率。 276 extern speed_t cfgetospeed (struct termios *termios_p); 277 // 将termios_p 所指termios 结构中的接收波特率设置为speed。 278 extern int cfsetispeed (struct termios *termios_p, speed_t speed); 279 // 将termios_p 所指termios 结构中的发送波特率设置为speed。 280 extern int cfsetospeed (struct termios *termios_p, speed_t speed); 281 // 等待fildes 所指对象已写输出数据被传送出去。 282 extern int tcdrain (int fildes); 283 // 挂起/重启fildes 所指对象数据的接收和发送。 284 extern int tcflow (int fildes, int action); 285 // 丢弃fildes 指定对象所有已写但还没传送以及所有已收到但还没有读取的数据。 286 extern int tcflush (int fildes, int queue_selector); 287 // 获取与句柄fildes 对应对象的参数,并将其保存在termios_p 所指的地方。 288 extern int tcgetattr (int fildes, struct termios *termios_p); 289 // 如果终端使用异步串行数据传输,则在一定时间内连续传输一系列0 值比特位。 290 extern int tcsendbreak (int fildes, int duration); 291 // 使用termios 结构指针termios_p 所指的数据,设置与终端相关的参数。 292 extern int tcsetattr (int fildes, int optional_actions, 293 struct termios *termios_p); 294 295 #endif