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

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

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

于等待串口数据的读入,可用fcntl()函数实现,如下所示:

fcntl(fd, F_SETFL, 0);

再接着可以测试打开文件描述符是否连接到一个终端设备,以进一步确认串口是否正确打开,如下所示:

isatty(STDIN_FILENO);

该函数调用成功则返回0,若失败则返回-1。

这时,一个串口就已经成功打开了。接下来就可以对这个串口进行读和写操作。下面给出了一个完整的打开串口的函数,同样考虑到了各种不同的情况。程序如下所示:

/*打开串口函数*/

int open_port(int com_port)

{

int fd;

#if (COM_TYPE == GNR_COM) /* 使用普通串口 */

char *dev[] = {"/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2"};

#else /* 使用USB转串口 */

char *dev[] = {"/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2"};

#endif

if ((com_port < 0) || (com_port > MAX_COM_NUM))

{

return -1;

}

/* 打开串口 */

fd = open(dev[com_port - 1], O_RDWR|O_NOCTTY|O_NDELAY);

if (fd < 0)

{

perror("open serial port");

return(-1);

}

/*恢复串口为阻塞状态*/

if (fcntl(fd, F_SETFL, 0) < 0)

{

perror("fcntl F_SETFL\n");

}

/*测试是否为终端设备*/

if (isatty(STDIN_FILENO) == 0)

{

perror("standard input is not a terminal device");

}

return fd;

}

2.读写串口

读写串口操作和读写普通文件一样,使用read()和write()函数即可,如下所示:

write(fd, buff, strlen(buff));

read(fd, buff, BUFFER_SIZE);

下面两个实例给出了串口读和写的两个程序,其中用到前面所讲述的open_port()和set_com_config ()函数。写串口的程序将在宿主机上运行,读串口的程序将在目标板上运行。

写串口的程序如下所示。

/* com_writer.c */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <errno.h>

#include "uart_api.h"

int main(void)

{

int fd;

char buff[BUFFER_SIZE];

if((fd = open_port(HOST_COM_PORT)) < 0) /* 打开串口 */

{

perror("open_port");

return 1;

}

if(set_com_config(fd, 115200, 8, 'N', 1) < 0) /* 配置串口 */

{

perror("set_com_config");

return 1;

}

do

{

printf("Input some words(enter 'quit' to exit):");

memset(buff, 0, BUFFER_SIZE);

if (fgets(buff, BUFFER_SIZE, stdin) == NULL)

{

perror("fgets");

break;

}

write(fd, buff, strlen(buff));

} while(strncmp(buff, "quit", 4));

close(fd);

return 0;

}

读串口的程序如下所示:

/* com_reader.c */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <errno.h>

#include "uart_api.h"

int main(void)

{

int fd;

char buff[BUFFER_SIZE];

if((fd = open_port(TARGET_COM_PORT)) < 0) /* 打开串口 */

{

perror("open_port");

return 1;

}

if(set_com_config(fd, 115200, 8, 'N', 1) < 0) /* 配置串口 */

{

perror("set_com_config");

return 1;

}

do

{

memset(buff, 0, BUFFER_SIZE);

if (read(fd, buff, BUFFER_SIZE) > 0)

{

printf("The received words are : %s", buff);

}

} while(strncmp(buff, "quit", 4));

close(fd);

return 0;

}

在宿主机上运行写串口的程序,而在目标板上运行读串口的程序,运行结果如下所示。

/* 宿主机 ,写串口*/

$ ./com_writer

Input some words(enter 'quit' to exit):hello, Reader!

Input some words(enter 'quit' to exit):I'm Writer!

Input some words(enter 'quit' to exit):This is a serial port testing program.

Input some words(enter 'quit' to exit):quit

/* 目标板 ,读串口*/

$

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

网站地图

Top