如何使用 C 从 Linux 中的串口读取数据? [英] How do I read data from serial port in Linux using C?

查看:88
本文介绍了如何使用 C 从 Linux 中的串口读取数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am new to serial programming in Linux using C. I have found a small piece of code to write data on serial port which I am sharing here. After running this code I may assume that data has written on a specific port. Now I would like to open another terminal and using separate code want to read the data written on that specific port - how do I do that?

#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
", 4);
  if (n < 0)
    fputs("write() of 4 bytes failed!
", stderr);

  return (fd);
}

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

The code above will write the data on a specific port.

推荐答案

理论上只要打开相关端口进行读取,使用read()获取数据即可.

In theory, all you have to do is open the relevant port for reading, and use read() to get the data.

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!
", stderr);
    return (fd);
}

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

There are differences; notably, the read needs a buffer to put the data in. The code shown discards the first message read. Note that a short read simply indicates that there was less data available than requested at the time when the read completed. It does not automatically indicate an error. Think of a command line; some commands might be one or two characters (ls) where others might be quite complex (find /some/where -name '*.pdf' -mtime -3 -print). The fact that the same buffer is used to read both isn't a problem; one read gives 3 characters (newline is included), the other 47 or so.

这篇关于如何使用 C 从 Linux 中的串口读取数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆