linux 串口通信之termios

144 篇文章 70 订阅

串口通信在工业控制中比较常见,常规的串口通信从原理上而言是比较简单的,但具体到linux的串口编程,尤其是要完全搞清楚各种眼花缭乱的termio属性设置,就没那么简单了。这些参数如果设置不合适,会导致串口通信出一些异常问题,要么收发数据不对,要么通信中断等。下面针对linux的串口编程常用的属性设置进行简单介绍。

典型的termios结构定义如下:
struct termios

{


   tcflag_t c_iflag; //输入模式标志


   tcflag_t c_oflag; //输出模式标志


   tcflag_t c_cflag;//控制模式标志


   tcflag_t c_lflag;//本地模式标志


   cc_t     c_cc[NCCS];//控制特性


};

四种类型标志分别有如下属性参数 输入模式标志(c_iflag:16bit) INPCK奇偶校验使能IGNPAR忽略奇偶校验错误PARMRK奇偶校验错误掩码ISTRIP裁剪掉第8比特IXON启动输出软件控制流IXOF启动输入软件控制流IXANY输入任意字符可以重新启动输入(默:起始字符)IGNBRK忽略输入终止条件BRKINT当检测到输入终止条件时发送SIGINT信号INLCR当收到NL(换行符)转换CR(回车符)IGNCR忽略收到的CRICRNL当收到CR转换为NLIUCLC讲接收到的大写字符映射为小写字符IMAXBEL当输入队列满时响铃输出模式标志(c_oflag :16bit)OPOST启动输出处理功能,如果不设置,其他位忽略OLCUC将输出中的大写字符转换成小写字符ONLCR将输出中的换行符(‘\n’)转换成回车符(‘\r’)ONOCR如果当前列号为0,则不输出回车字符OCRNL将输出中的回车符转换成换行ONLRET不输出回车符OFILL发送填充字符以提供延时OFDEL如果设置该标志,则表示填充字符为DEL字符,否则为NULNLDLY换行延时掩码CRDLY回车延时掩码TABDLY制表符延时掩码BSDLY水平退格符延时掩码VTDLY垂直退格符延时掩码FFLDY换页符延时掩码控制模式标志(c_cflag:16bit)CBAUD波特率的位掩码B00波特率(放弃DTR)……B18001800的波特率B24002400的波特率B48004800的波特率B96009600的波特率B1920019200的波特率B3840038400的波特率B5760057600的波特率B115200115200的波特率EXTA外部时钟率EXTB外部时钟率CSIZE数据位的位掩码CS55个数据位CS66个数据位CS77个数据位CS88个数据位CSTOPB2个停止位(不设置则是一个)GREAD接收使能PARENB

PARODD校验使能位

使用奇校验而不是偶校验HUPCL最后关闭时挂线(放弃DTR)CLOCAL本地连接(不改变端口所有者)CRTSCTS硬件流控

本地模式标志(c_lflag:16bit)ISIG若收到信号字符(INTR,QUIT等)则会产生相应的信号ICANON启动规范模式ECHO启动本地回显功能ECHOE若设置ICANON则允许退格操作ECHOK若设置ICANON,则KILL字符会删除当前行ECHONL若设置ICANON,则允许回显换行符ECHOCTL若设置ECHO,则控制字符会显示成^x,其中x的ASCII码等于给相应的控制字符的ASCII码加上0x40.ECHOPRT若设置ICANON和IECHO,则删除字符和被删除的字符都会被显示ECHOKE若设置ICANON,则允许回显在ECHOE和ECHOPRT中设定的KILL字符NOFLASH在通常情况下,当接收到INTR,QUIT,SUSP控制字符时,会清空输入和输出队列。如果设置改标志,则所有的队列不会被清空TOSTOP若一个后台进程师徒向他的控制终端进行写操作,则系统向改后台进程的进程组发送SIGTTOU信号。该信号通常终止进程的执行IEXTEN启动输入处理功能控制特性(c_cc[])VINTR中断控制字符,对应的键位ctrl+cVQUIT退出操作符,对应的键为ctrl+zVERASE删除操作符,对应BackspaceVKILL删除行符,对应的键为ctrl+uVEOF文件结尾符,对应的键为ctrl+dVEOL附加行结尾符,对应的键为carriage returnVEOL2第二行结尾符,对应的键为line feedVMIN指定最少读取的字符数VTIME指定读取的每个字符之间的超时时间上述属性可以通过位掩码的方式关闭或者激活;

比如:

newtio.c_cflag |=CLOCAL |CREAD;

newtio.c_cflag &=~CSIZE;

但设置串口波特率的最好通过专门的设置函数

cfsetispeed(&new_cfg,B115200);

fsetospeed(&new_cfg,B115200);

让参数生效可以调用函数:

int tcsetattr(int fd , int actions , const struct termios *termios_h);

参数actions控制修改方式,共有三种修改方式,如下所示。

1、TCSANOW:立刻对值进行修改

2、TCSADRAIN:等当前的输出完成后再对值进行修改。

3、TCSAFLUSH:等当前的输出完成之后,再对值进行修改,但丢弃还未从read调用返回的当前的可用的任何输入。

备注:

点击下面链接,进入奥比中光开发者社区,了解更多3D视觉技术信息:
https://developer.orbbec.com.cn/

或扫描下方二维码,进入奥比中光开发者社区:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值