串口属性设置_第1页
串口属性设置_第2页
串口属性设置_第3页
串口属性设置_第4页
串口属性设置_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

属性描述串口属于终端设备,其接口属性用termios结构描述,如程序清单13.9所示。程序清单13.9termios结构structtermios{tcflag_tc_cflag/*控制标志*/tcflag_tc_iflag;/*输入标志*/tcflag_tc_oflag;/*输出标志*/tcflag_tc_lflag;/*本地标志*/tcflag_tc_cc[NCCS];/*控制字符*/};粗略而言,控制标志影响到RS-232串行线(如:忽略调制解调器的状态线、每个字符需要一个或两个停止位等),输入标志由终端设备驱动程序用来控制字符的输入(如:剥除输入字节的第8位,允许输入奇偶校验等),输出控制则控制驱动程序输出(如:执行输出处理、将换行符映射为CR/LF等),本地标志影响驱动程序和用户之间的接口(如:本地回显的开和关等),c_cc数组则包含了所有可以更改的特殊字符。(1)控制标志c_cflag成员控制着波特率、数据位、奇偶校验、停止位以及流控制,表13.4列出了c_cflag可用的部分选项。表13.4c_cflag部分可用选项标志说明标志说明CBAUD波特率位屏蔽CSIZE数据位屏蔽B00位/秒(挂起)CS55位数据位B110100位/秒CS66位数据位B134134位/秒CS77位数据位B12001200位/秒CS88位数据位B24002400位/秒CSTOPB2位停止位,否则为1位B48004800位/秒CREAD启动接收B96009600位/秒PARENB进行奇偶校验B1920019200位/秒PARODD奇校验,否则为偶校验B5760057600位/秒HUPCL最后关闭时断开B115200115200位/秒CLOCAL忽略调制调解器状态行B460800460800位/秒——c_cflag成员的CREAD和CLOCAL选项通常是要启用的,这两个选项使驱动程序启动接收字符装置,同时忽略串口信号线的状态。(2)输入标志c_iflag成员负责控制串口输入数据的处理,表13.5所示是c_iflag的部分可用标志。表13.5c_iflag标志.标志说明INPCK打开输入奇偶校验IGNPAR忽略奇偶错字符PARMRK标记奇偶错ISTRIP剥除字符第8位IXON启用/停止输出控制流起作用IXOFF启用/停止输入控制流起作用IGNBRK忽略BREAK条件INLCR将输入的NL转换为CRIGNCR忽略CRICRNL将输入的CR转换为NL设置输入校验当c_cflag成员的PARENB(奇偶校验)选项启用时,c_iflag的也应启用奇偶校验选项。操作方法是启用INPCK和ISTRIP选项:options.c_iflag|=(INPCK|ISTRIP);注意:IGNPAR选项在一些场合的应用带有一定的危险性,它指示串口驱动程序忽略奇偶校验错误,也就是说,IGNPAR使奇偶校验出错的字符也通过输入。这在测试通信链路的质量时也许有用,但在通常的数据通信应用中不应使用。设置软件流控制使用软件流控制是启用IXON、IXOFF和IXANY选项:options.c_iflag|=(IXON|IXOFF|IXANY);相反,要禁用软件流控制是禁止上面的选项:options.c_iflag&=~(IXON|IXOFF|IXANY);输出标志c_oflag成员管理输出过滤,如表13.6所示是c_oflag成员的部分选项标志。表13.6c_oflag标志标志说明BSDLY退格延迟屏蔽CMSPAR标志或空奇偶性CRDLYCR延迟屏蔽FFDLY换页延迟屏蔽OCRNL将输出的CR转换为NLOFDEL填充符为DEL,否则为NULLOFILL对于延迟使用填充符OLCUC将输出的小写字符转换为大写字符ONLCR将NL转换为CR-NLONLRETNL执行CR功能ONOCR在0列不输出CROPOST执行输出处理OXTABS将制表符扩充为空格启用输出处理启用输出处理需要在c_oflag成员中启用OPOST选项,其操作方法如下:options.c_oflag|=OPOST;使用原始输出使用原始输出,就是禁用输出处理,使数据能不经过处理、过滤地完整地输出到串口接口。当OPOST被禁止,c_oflag其它选项也被忽略,其操作方法如下:options.c_oflag&=~OPOST;本地标志本地标志c_lflag控制着串口驱动程序如何管理输入的字符,如表13.7所示是c_lflag的部分可用标志。表13.7c_lflag标志标志 说明ISIG 启用终端产生的信号ICANON 启用规范输入XCASE 规范大/小写表示ECHO 进行回送ECHOE 可见擦除字符ECHOK 回送kill符ECHONL 回送NLNOFLSH 在中断或退出键后禁用刷清IEXTEN 启用扩充的输入字符处理ECHOCTL 回送控制字符为A(char)ECHOPRT 硬拷贝的可见擦除方式ECHOKE Kill的可见擦除PENDIN 重新打印未决输入TOSTOP 对于后台输出发送SIGTTOU选择规范模式规范模式是行处理的。调用read读取串口数据时,每次返回一行数据。当选择规范模式时,需要启用ICANON、ECHO和ECHOE选项:options.c_lflag1=(ICANONIECHOIECHOE);当串口设备作为用户终端时,通常要把串口设备配置成规范模式。选择原始模式在原始模式下,串口输入数据是不经过处理的,在串口接口接收的数据被完整保留。要使串口设备工作在原始模式,需要关闭ICANON、ECHO、ECHOE和ISIG选项,其操作方法如下:options.c_lflag&=〜(ICANONIECHOIECHOEIISIG);(4)控制字符组c_cc数组的长度是NCCS,一般介于15-20之间。c_cc数组的每个成员的下标都用一个宏表示,表13.8列出了c_cc的部分下标标志名及其对应说明。表13.8c_cc标志标志 说明VINTR 中断VQUIT 退出VERASE 擦除VEOF 行结束VEOL 行结束VMIN 需读取的最小字节数VTIME 与“VMIN”配合使用,是指限定的传输或等待的最长时间在规范模式下,调用read读取串口数据时,通常是返回一行数据。而在原始模式下,串口输入数据是不分行的。在原始模式下,返回读取数据的数量需要考虑两个变量:MIN和TIME。MIN和TIME在c_cc数组中的下标名为VMIN和VTIME。MIN是指一次read调用期望返回的最小字节数。TIME与MIN组合使用,其具体含义分以下四种情形:1) 当MIN>0,TIME>0时TIME为接收到第一个字节后允许的数据传输或等待的最长分秒数(1分秒=0.1秒)。定时器在收到第一个字节后启动,在计时器超时之前,若已收到MIN个字节,则read返回MIN个字节,否则,在计时器超时后返回实际接收到的字节。注意:因为只有在接收到第一个字节时才启动,所以至少可以返回1个字节。这种情形中,在接到第一个字节之前,调用者阻塞。如果在调用read时数据已经可用,则如同在read后数据立即被接到一样。2) 当MIN>0,TIME=0时MIN个字节完整接收后,read才返回,这可能会造成read无限期地阻塞。3) 当MIN=0,TIME>0时TIME为允许等待的最大时间,计时器在调用read时立即启动,在串口接到1字节数据或者计时器超时后即返回,如果是计时器超时,则返回0。4) 当MIN=0,TIME=0时如果有数据可用,则read最多返回所要求的字节数,如果无数据可用,则read立即返回0。属性设置使用函数tcgetattr和tcsetattr可以获取和设置串口termios结构属性,如程序清单13.10所示。程序清单13.10设置和获取termios结构属性#include<termios.h>/*使用终端接口函数需要使用此头文件*/inttcgetattr(intfd,structtermios*termptr);inttcsetattr(intfd,intopt,conststructtermios*termptr);其中:fd为串口设备文件描述符,termptr参数在tcgetattr函数中是用于存放串口设置的termios结构体,opt是整形变量,使用方法如下:1) TCSANOW:更改立即发生;2) TCSADRAIN:发送了所有输出后更改才发生,若更改输出参数则应用此选项;3) TCSAFLUSH:发送了所有输出后更改才发生,更进一步,在更改发生时未读的所有输入数据被删除(Flush)。在串口驱动程序里,有输入缓冲区和输出缓冲区。在改变串口属性时,缓冲区中的数据可能还存在,这时需要考虑到更改后的属性什么时候起作用。tcsetattr的参数opt可以指定在什么时候新的串口属性才起作用。上述两函数执行时,若成功则返回0,若出错则返回-1。掌握了如何获取和设置串口的属性结构后,下面将介绍串口主要属性的修改,即修改termios结构体的成员。termios结构体的各个成员的各个选项中除需要用屏蔽标志的选项外(如波特率选项、数据位选项等),都是按位表示的,对这些选项的设置或清除可以直接用你”或“&”逻辑运算来完成。需要用屏蔽标志的选项的话则需要先用“&”运算清除原设置,再用“人”运算设置新选项。例如,为了设置字符长度,需先用字符长度屏蔽标志CSIZE将表示字符长度的位清0,然后再将对应位设置为CS5、CS6、CS7或CS8。设置波特率串口的输入和输出波特率可分别用cfsetispeed()和cfsetospeed()函数来设置,如程序清单13.11所示。程序清单13.11设置串口输入/输出波特率函数#include<termios.h>intcfsetispeed(structtermios*termptr,speed_tspeed);intcfsetospeed(structtermios*termptr,speed_tspeed);这两个函数若执行成功返回0,若出错则返回-1。使用这两个函数时,应当理解输入、输出波特率是存在串口设备termios结构中的。在调用任一cfset函数之前,先要用tcgetattr获得设备的termios结构。与此类似,在调用任一cfset函数后,波特率都被设置到termios结构中。为使这种更改影响到设备,应当调用tcsetattr函数。操作方法如程序清单13.12所示。程序清单13.12设置波特率示例if(tcgetattr(fd,&opt)<0){returnERROR;}cfsetispeed(&opt,B9600);cfsetospeed(&opt,B9600);if(tcsetattr(fd,TCSANOW,&opt)<0){returnERROR;}设置数据位设置数据位不需要专用的函数,只需要在设置数据位之前用数据位屏蔽标志CSIZE)把对应数据位清零,然后再设置新的数据位即可,如下所示:options.c_cflag&=~CSIZE;/*先把数据位清零*/options.c_cflag|=CS8;/*把数据位设置为8位*/设置奇偶校验正如设置数据位一样,设置奇偶校验是在直接在cflag成员上设置。下面是各种类型的校验设置方法。无奇偶校验(8N1):options.c_cflag&=~PARENB;options.c_cflag&=~CSTOPB;options.c_cflag&=~CSIZE;options.c_cflag|=CS8;7位数据位奇偶校验(7E1):options.c_cflag|=PARENB;options.c_cflag&=~PARODD;options.c_cflag&=~CSTOPB;options.c_cflag&=~CSIZE;options.c_cflag|=CS7;奇校验(7O1):options.c_cflagl=PARENB;options.c_cflagl=PARODD;options.c_cflag&=~CSTOPB;options.c_cflag&=~CSIZE;options.c_cflag|=CS7;串口设置示例:staticintUART2_Init(void){structtermiosopt;//属性描述fdUart2=open(DEV_UART2,O_RDWR|O_NOCTTY);if(fdUart2<0){perror(DEV_UART2);return-1;}tcgetattr(fdUart2,&opt); 〃获取串口属性结构体对象cfsetispeed(&opt,B38400); 〃设置输入波特率cfsetospeed(&opt,B38400); 〃设置输出波特率/*rawmode*/ 〃偶校验opt.c_lflag&=~(ECHO|ICANON|IEXTEN|ISIG);//

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论