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

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

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

示:

int set_com_config(int fd,int baud_rate,

int data_bits, char parity, int stop_bits)

{

struct termios new_cfg,old_cfg;

int speed;

/*保存并测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息*/

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

{

perror("tcgetattr");

return -1;

}

/* 设置字符大小*/

new_cfg = old_cfg;

cfmakeraw(&new_cfg); /* 配置为原始模式 */

new_cfg.c_cflag &= ~CSIZE;

/*设置波特率*/

switch (baud_rate)

{

case 2400:

{

speed = B2400;

}

break;

case 4800:

{

speed = B4800;

}

break;

case 9600:

{

speed = B9600;

}

break;

case 19200:

{

speed = B19200;

}

break;

case 38400:

{

speed = B38400;

}

break;

default:

case 115200:

{

speed = B115200;

}

break;

}

cfsetispeed(&new_cfg, speed);

cfsetospeed(&new_cfg, speed);

/*设置停止位*/

switch (data_bits)

{

case 7:

{

new_cfg.c_cflag |= CS7;

}

break;

default:

case 8:

{

new_cfg.c_cflag |= CS8;

}

break;

}

/*设置奇偶校验位*/

switch (parity)

{

default:

case 'n':

case 'N':

{

new_cfg.c_cflag &= ~PARENB;

new_cfg.c_iflag &= ~INPCK;

}

break;

case 'o':

case 'O':

{

new_cfg.c_cflag |= (PARODD | PARENB);

new_cfg.c_iflag |= INPCK;

}

break;

case 'e':

case 'E':

{

new_cfg.c_cflag |= PARENB;

new_cfg.c_cflag &= ~PARODD;

new_cfg.c_iflag |= INPCK;

}

break;

case 's': /*as no parity*/

case 'S':

{

new_cfg.c_cflag &= ~PARENB;

new_cfg.c_cflag &= ~CSTOPB;

}

break;

}

/*设置停止位*/

switch (stop_bits)

{

default:

case 1:

{

new_cfg.c_cflag &= ~CSTOPB;

}

break;

case 2:

{

new_cfg.c_cflag |= CSTOPB;

}

}

/*设置等待时间和最小接收字符*/

new_cfg.c_cc[VTIME] = 0;

new_cfg.c_cc[VMIN] = 1;

/*处理未接收字符*/

tcflush(fd, TCIFLUSH);

/*激活新配置*/

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

{

perror("tcsetattr");

return -1;

}

return 0;

}

6.4.3 串口使用详解

在配置完串口的相关属性后,就可以对串口进行打开和读写操作了。它所使用的函数和普通文件的读写函数一样,都是open()、write()和read()。它们之间的区别的只是串口是一个终端设备,因此在选择函数的具体参数时会有一些区别。另外,这里会用到一些附加的函数,用于测试终端设备的连接情况等。下面将对其进行具体讲解。

1.打开串口

打开串口和打开普通文件一样,都是使用open()函数,如下所示:

fd = open( "/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);

可以看到,这里除了普通的读写参数外,还有两个参数O_NOCTTY和O_NDELAY。

n O_NOCTTY标志用于通知Linux系统,该参数不会使打开的文件成为这个进程的控制终端。如果没有指定这个标志,那么任何一个输入(诸如键盘中止信号等)都将会影响用户的进程。

n O_NDELAY标志通知Linux系统,这个程序不关心DCD信号线所处的状态(端口的另一端是否激活或者停止)。如果用户指定了这个标志,则进程将会一直处在睡眠状态,直到DCD信号线被激活。

接下来可恢复串口的状态为阻塞状态,用

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

网站地图

Top