文件I/O编程之: 嵌入式Linux串口应用编程
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教程
评论