如何在Linux中使用C从串口读取数据?

我是使用C语言在Linux中进行串行编程的新手。我发现了一小段代码,用于在串口上写入数据。 运行此代码后,我可能会认为数据已写入特定的端口。 现在我想打开另一个terminal,并使用单独的代码来读取写在特定端口上的数据 – 我该怎么做?

#include <stdio.h> /* Standard input/output definitions */ #include <string.h> /* String function definitions */ #include <unistd.h> /* UNIX standard function definitions */ #include <fcntl.h> /* File control definitions */ #include <errno.h> /* Error number definitions */ #include <termios.h> /* POSIX terminal control definitions */ /* * 'open_port()' - Open serial port 1. * * Returns the file descriptor on success or -1 on error. */ int open_port(void) { int fd; /* File descriptor for the port */ fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { /* Could not open the port. */ perror("open_port: Unable to open /dev/ttyS0 - "); } else fcntl(fd, F_SETFL, 0); n = write(fd, "ATZ\r", 4); if (n < 0) fputs("write() of 4 bytes failed!\n", stderr); return (fd); } 

上面的代码将数据写入特定的端口。

从理论上说,你所要做的就是打开相关的端口进行阅读,并使用read()来获取数据。

 int read_port(void) { int fd = open("/dev/ttyS0", O_RDONLY | O_NOCTTY); if (fd == -1) { /* Could not open the port. */ perror("open_port: Unable to open /dev/ttyS0 - "); } char buffer[32]; int n = read(fd, buffer, sizeof(buffer)); if (n < 0) fputs("read failed!\n", stderr); return (fd); } 

有差异; 值得注意的是,读取需要缓冲区来放入数据。所显示的代码丢弃读取的第一条消息。 请注意,简短的读取仅表示读取完成时的可用数据少于请求的数据。 它不会自动显示错误。 想想一个命令行; 一些命令可能是一个或两个字符( ls ),而其他的可能相当复杂( find /some/where -name '*.pdf' -mtime -3 -print )。 使用同一个缓冲区来读取这两个数据并不成问题。 一个read 3个字符(包括换行符),另外47个左右。

张贴的节目做了关于港口状态的许多假设。 在真实世界的应用程序中,您应该明确地完成所有重要的设置。 我认为在POSIX下学习串口编程的最好的资源是

用于POSIX操作系统的串行编程指南

我在这里镜像: http : //mirror.datenwolf.net/serial/