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

时间:2011-12-22 06:43:04

标签: c linux serial-port

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

#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);
}

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

2 个答案:

答案 0 :(得分:10)

理论上,您所要做的就是打开相关的阅读端口,并使用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个左右。

答案 1 :(得分:7)

发布的程序对端口的状态做了很多假设。在现实世界的应用程序中,您应该明确地执行所有重要的设置。我认为在POSIX下学习串口编程的最佳来源是

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

我在这里反映它:https://www.cmrr.umn.edu/~strupp/serial.html