微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 文件I/O编程之: 嵌入式Linux串口应用编程

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

时间:08-13 来源:3721RD 点击:

首先,为了安全起见和以后调试程序方便,可以先保存原先串口的配置,在这里可以使用函数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()等函数来处理目前串口缓冲中的数据,它们的格式如下所示。

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

int tcflow(int fd, int action) ; /* 用于暂停或重新开始输出 */

int tcflush(int fd, int queue_selector); /* 用于清空输入/输出缓冲区*/

在本实例中使用tcflush()函数,对于在缓冲区中的尚未传输的数据,或者收到的但是尚未读取的数据,其处理方法取决于queue_selector的值,它可能的取值有以下几种。

n TCIFLUSH:对接收到而未被读取的数据进行清空处理。

n TCOFLUSH:对尚未传送成功的输出数据进行清空处理。

n TCIOFLUSH:包括前两种功能,即对尚未处理的输入输出数据进行清空处理。

如在本例中所采用的是第一种方法:

tcflush(fd, TCIFLUSH);

9.激活配置

在完成全部串口配置之后,要激活刚才的配置并使配置生效。这里用到的函数是tcsetattr(),它的函数原型是:

tcsetattr(int fd, int optional_actions, const struct termios *termios_p);

其中参数termios_p是termios类型的新配置变量。

参数optional_actions可能的取值有以下3种:

n TCSANOW:配置的修改立即生效。

n TCSADRAIN:配置的修改在所有写入fd的输出都传输完毕之后生效。

n TCSAFLUSH:所有已接受但未读入的输入都将在修改生效之前被丢弃。

该函数若调用成功则返回0,若失败则返回-1,代码如下所示:

if ((tcsetattr(fd, TCSANOW, &new_cfg)) != 0)

{

perror("tcsetattr");

return -1;

}

下面给出了串口配置的完整函数。通常,为了函数的通用性,通常将常用的选项都在函数中列出,这样可以大大方便以后用户的调试使用。该设置函数如下所

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top