新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 文件I/O编程之: 嵌入式Linux串口应用编程

文件I/O编程之: 嵌入式Linux串口应用编程

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257136.htm

c_lflag用于控制控制终端的本地数据处理和工作模式,c_lflag所支持的常量名称如表6.14所示。

表6.14 c_lflag支持的常量名称

ISIG

若收到信号字符(INTR、QUIT等),则会产生相应的信号

ICANON

启用规范模式

ECHO

启用本地回显功能

ECHOE

若设置ICANON,则允许退格操作

ECHOK

若设置ICANON,则KILL字符会删除当前行

ECHONL

若设置ICANON,则允许回显换行符

ECHOCTL

若设置ECHO,则控制字符(制表符、换行符等)会显示成“^X”,其中X的ASCII码等于给相应控制字符的ASCII码加上0x40。例如:退格字符(0x08)会显示为“^H”(’H’的ASCII码为0x48)

ECHOPRT

若设置ICANON和IECHO,则删除字符(退格符等)和被删除的字符都会被显示

ECHOKE

若设置ICANON,则允许回显在ECHOE和ECHOPRT中设定的KILL字符

NOFLSH

在通常情况下,当接收到INTR、QUIT和SUSP控制字符时,会清空输入和输出队列。如果设置该标志,则所有的队列不会被清空

TOSTOP

若一个后台进程试图向它的控制终端进行写操作,则系统向该后台进程的进程组发送SIGTTOU信号。该信号通常终止进程的执行

IEXTEN

启用输入处理功能

c_cc定义特殊控制特性。c_cc所支持的常量名称如表6.13所示。

表6.13 c_cc支持的常量名称

VINTR

中断控制字符,对应键为CTRL+C

VQUIT

退出操作符,对应键为CRTL+Z

VERASE

删除操作符,对应键为Backspace(BS)

VKILL

删除行符,对应键为CTRL+U

VEOF

文件结尾符,对应键为CTRL+D

VEOL

附加行结尾符,对应键为Carriagereturn(CR)

VEOL2

第二行结尾符,对应键为Linefeed(LF)

VMIN

指定最少读取的字符数

VTIME

指定读取的每个字符之间的超时时间

下面就详细讲解设置属性的基本流程。

1.保存原先配置

首先,为了安全起见和以后调试程序方便,可以先保存原先的配置,在这里可以使用函数tcgetattr(fd,old_cfg)。该函数得到fd指向的终端的配置参数,并将它们保存于termios结构变量old_cfg中。该函数还可以测试配置是否正确、该串口是否可用等。若调用成功,函数返回值为0,若调用失败,函数返回值为-1,其使用如下所示:

if(tcgetattr(fd,old_cfg)!=0)

{

perror(tcgetattr);

return-1;

}

2.激活选项

CLOCAL和CREAD分别用于本地连接和接受使能,因此,首先要通过位掩码的方式激活这两个选项。

newtio.c_cflag|=CLOCAL|CREAD;

调用cfmakeraw()函数可以将终端设置为原始模式,在后面的实例中,采用原始模式进行串口数据通信。

cfmakeraw(new_cfg);

3.设置波特率

设置波特率有专门的函数,用户不能直接通过位掩码来操作。设置波特率的主要函数有:cfsetispeed()和cfsetospeed()。这两个函数的使用很简单,如下所示:

cfsetispeed(new_cfg,B115200);

cfsetospeed(new_cfg,B115200);

一般地,用户需将终端的输入和输出波特率设置成一样的。这几个函数在成功时返回0,失败时返回-1。

4.设置字符大小

与设置波特率不同,设置字符大小并没有现成可用的函数,需要用位掩码。一般首先去除数据位中的位掩码,再重新按要求设置。如下所示:

new_cfg.c_cflag=~CSIZE;/*用数据位掩码清空数据位设置*/

new_cfg.c_cflag|=CS8;

5.设置奇偶校验位

设置奇偶校验位需要用到termios中的两个成员:c_cflag和c_iflag。首先要激活c_cflag中的校验位使能标志PARENB和是否要进行偶校验,同时还要激活c_iflag中的对于输入数据的奇偶校验使能(INPCK)。如使能奇校验时,代码如下所示:

new_cfg.c_cflag|=(PARODD|PARENB);

new_cfg.c_iflag|=INPCK;

而使能偶校验时,代码如下所示:

new_cfg.c_cflag|=PARENB;

new_cfg.c_cflag=~PARODD;/*清除偶校验标志,则配置为奇校验*/

new_cfg.c_iflag|=INPCK;

6.设置停止位

设置停止位是通过激活c_cflag中的CSTOPB而实现的。若停止位为一个,则清除CSTOPB,若停止位为两个,则激活CSTOPB。以下分别是停止位为一个和两个比特时的代码:

new_cfg.c_cflag=~CSTOPB;/*将停止位设置为一个比特*/

new_cfg.c_cflag|=CSTOPB;/*将停止位设置为两个比特*/

7.设置最少字符和等待时间

在对接收字符和等待时间没有特别要求的情况下,可以将其设置为0,则在任何情况下read()函数立即返回,如下所示:

new_cfg.c_cc[VTIME]=0;

new_cfg.c_cc[VMIN]=0;

8.清除串口缓冲

由于串口在重新设置之后,需要对当前的串口设备进行适当的处理,这时就可调用在termios.h>中声明的tcdrain()、tcflow()、tcflush()等函数来处理目前串口缓冲中的数据,它们的格式如下所示。

inttcdrain(intfd);/*使程序阻塞,直到输出缓冲区的数据全部发送完毕*/

inttcflow(intfd,intaction);/*用于暂停或重新开始输出*/

inttcflush(intfd,intqueue_selector);/*用于清空输入/输出缓冲区*/

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程




评论


相关推荐

技术专区

关闭