Linux下的串口编程:struct termios布局体
副标题#e#
termios布局体说明
termios布局体中,该布局体一般包罗如下的成员:
tcflag_t c_iflag;
tcflag_t c_oflag;
tcflag_t c_cflag;
tcflag_t c_lflag;
cc_t c_cc[NCCS];
其详细意义如下
c_iflag:输入模式符号,节制终端输入方法,详细参数如下所示。
c_iflag参数表
键值说明
IGNBRK 忽略BREAK键输入
BRKINT 假如配置了IGNBRK,BREAK键的输入将被忽略,假如配置了BRKINT ,将发生SIGINT间断
IGNPAR 忽略奇偶校验错误
PARMRK 标识奇偶校验错误
INPCK 答允输入奇偶校验
ISTRIP 去除字符的第8个比特
INLCR 将输入的NL(换行)转换成CR(回车)
IGNCR 忽略输入的回车
ICRNL 将输入的回车转化成换行(假如IGNCR未配置的环境下)
IUCLC 将输入的大写字符转换成小写字符(非POSIX)
IXON 答允输入时对XON/XOFF流举办节制
IXANY 输入任何字符将重启遏制的输出
IXOFF 答允输入时对XON/XOFF流举办节制
IMAXBEL 当输入行列满的时候开始响铃,Linux在利用该参数而是认为该参数老是已经配置
c_oflag:输出模式符号,节制终端输出方法,详细参数如下所示。
c_oflag参数
键值说明
OPOST 处理惩罚后输出
OLCUC 将输入的小写字符转换成大写字符(非POSIX)
ONLCR 将输入的NL(换行)转换成CR(回车)及NL(换行)
OCRNL 将输入的CR(回车)转换成NL(换行)
ONOCR 第一行不输出回车符
ONLRET 不输出回车符
OFILL 发送填充字符以延迟终端输出
OFDEL 以ASCII码的DEL作为填充字符,假如未配置该参数,填充字符将是NUL(‘/0’)(非POSIX)
NLDLY 换行输出延时,可以取NL0(不延迟)或NL1(延迟0.1s)
CRDLY 回车延迟,取值范畴为:CR0、CR1、CR2和 CR3
TABDLY 程度制表符输出延迟,取值范畴为:TAB0、TAB1、TAB2和TAB3
BSDLY 空格输出延迟,可以取BS0或BS1
VTDLY 垂直制表符输出延迟,可以取VT0或VT1
FFDLY 换页延迟,可以取FF0或FF1
c_cflag:节制模式符号,指定终端硬件节制信息,详细参数如下所示。
c_oflag参数
键值说明
CBAUD 波特率(4+1位)(非POSIX)
CBAUDEX 附加波特率(1位)(非POSIX)
CSIZE 字符长度,取值范畴为CS5、CS6、CS7或CS8
CSTOPB 配置两个遏制位
CREAD 利用吸收器
PARENB 利用奇偶校验
PARODD 对输入利用奇偶校验,对输出利用偶校验
HUPCL 封锁设备时挂起
CLOCAL 忽略调制解调器线路状态
CRTSCTS 利用RTS/CTS流节制
c_lflag:当地模式符号,节制终端编辑成果,详细参数如下所示。
c_lflag参数
键值说明
ISIG 当输入INTR、QUIT、SUSP或DSUSP时,发生相应的信号
ICANON 利用尺度输入模式
XCASE 在ICANON和XCASE同时配置的环境下,终端只利用大写。假如只配置了XCASE,则输入字符将被转换为小写字符,除非字符利用了转义字符(非POSIX,且Linux不支持该参数)
ECHO 显示输入字符
ECHOE 假如ICANON同时配置,ERASE将删除输入的字符,WERASE将删除输入的单词
ECHOK 假如ICANON同时配置,KILL将删除当前行
ECHONL 假如ICANON同时配置,纵然ECHO没有配置依然显示换行符
ECHOPRT 假如ECHO和ICANON同时配置,将删除打印出的字符(非POSIX)
TOSTOP 向靠山输出发送SIGTTOU信号
#p#副标题#e#
与此布局体相关的函数
(一)tcgetattr()
1.原型
int tcgetattr(int fd,struct termois & termios_p);
2.成果
取得终端介质(fd)初始值,并把其值 赋给temios_p;函数可以从靠山历程中挪用;可是,终端属性大概被厥后的前台历程所改变。
(二)tcsetattr()
1.原型
int tcsetattr(int fd,int actions,const struct termios *termios_p);
2.成果
配置与终端相关的参数 (除非需要底层支持却无法满意),利用 termios_p 引用的 termios 布局。optional_actions (tcsetattr函数的第二个参数)指定了什么时候改变会起浸染:
TCSANOW:改变当即产生
TCSADRAIN:改变在所有写入 fd 的输出都被传输后生效。这个函数该当用于修改影响输出的参数时利用。(当前输出完成时将值改变)
TCSAFLUSH :改变在所有写入 fd 引用的工具的输出都被传输后生效,所有已接管但未读入的输入都在改变产生前扬弃(同TCSADRAIN,但会舍弃当前所有值)。
(三)tcsendbreak()
传送持续的 0 值比特流,一连一段时间,假如终端利用异步串行数据传输的话。假如 duration 是 0,它至少传输 0.25 秒,不会高出 0.5 秒。假如 duration 非零,它发送的时间长度由实现界说。
假如终端并非利用异步串行数据传输,tcsendbreak() 什么都不做。
(四)tcdrain()
期待直到所有写入 fd 引用的工具的输出都被传输。
(五)tcflush()
扬弃要写入 引用的工具,可是尚未传输的数据,可能收到可是尚未读取的数据,取决于 queue_selector 的值:
TCIFLUSH :刷新收到的数据可是不读
TCOFLUSH :刷新写入的数据可是不传送
TCIOFLUSH :同时刷新收到的数据可是不读,而且刷新写入的数据可是不传送
(六)tcflow()
挂起 fd 引用的工具上的数据传输或吸收,取决于 action 的值:
TCOOFF :挂起输出
TCOON :从头开始被挂起的输出
TCIOFF :发送一个 STOP 字符,遏制终端设备向系统传送数据
TCION :发送一个 START 字符,使终端设备向系统传输数据
打开一个终端设备时的默认配置是输入和输出都没有挂起。
(七)波特率函数
被用来获取和配置 termios 布局中,输入和输出波特率的值。新值不会顿时生效,直到乐成挪用了 tcsetattr() 函数。
配置速度为 B0 使得 modem "挂机"。与 B38400 相应的实际比特率可以用 setserial(8) 调解。
输入和输出波特率被生存于 termios 布局中。
cfmakeraw 配置终端属性如下:
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;
1.cfgetospeed() 返回 termios_p 指向的 termios 布局中存储的输出波特率
2.cfsetospeed() 配置 termios_p 指向的 termios 布局中存储的输出波特率为 speed。取值必需是以下常量之一:
#p#分页标题#e#
B0 B50 B75 B110 B134 B150 B200 B300 B600 B1200 B1800 B2400 B4800 B9600 B19200 B38400 B57600 B115200 B230400
个中:零值 B0 用来间断毗连。假如指定了 B0,不应当再假定存在毗连。凡是,这样将断开毗连。CBAUDEX 是一个掩码,指示高于 POSIX.1 界说的速度的那一些 (57600 及以上)。因此,B57600 & CBAUDEX 为非零。
3.cfgetispeed() 返回 termios 布局中存储的输入波特率。
4.cfsetispeed() 配置 termios 布局中存储的输入波特率为 speed。假如输入波特率被设为0,实际输入波特率将便是输出波特率。
RETURN VALUE 返回值
1.cfgetispeed() 返回 termios 布局中存储的输入波特率。
2.cfgetospeed() 返回 termios 布局中存储的输出波特率。
3.其他函数返回:
(1)0:乐成
(2) -1:失败,
而且为 errno 置值来指示错误。
留意 tcsetattr() 返回乐成,假如任何所要求的修改可以实现的话。因此,当举办多重修改时,该当在这个函数之后再次挪用 tcgetattr() 来检测是否所有修改都乐成实现
本文出自 “驿落薄暮” 博客,请务必保存此出处http://yiluohuanghun.blog.51cto.com/3407300/1182210