web-dev-qa-db-ja.com

Cを使用してLinuxのシリアルポートからデータを読み取るにはどうすればよいですか?

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

上記のコードは、特定のポートにデータを書き込みます。

11

理論的には、関連するポートを開いて読み取り、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);
}

違いがあります。特に、読み取りにはデータを入れるためのバッファーが必要です。示されているコードは、読み取られた最初のメッセージを破棄します。短い読み取りは、読み取りが完了したときに要求されたデータよりも利用可能なデータが少なかったことを単に示していることに注意してください。エラーを自動的に示すわけではありません。コマンドラインについて考えてください。一部のコマンドは1文字または2文字(ls)である場合がありますが、他のコマンドは非常に複雑な場合があります(find /some/where -name '*.pdf' -mtime -3 -print)。両方を読み取るために同じバッファーが使用されるという事実は問題ではありません。 1つのreadは3文字(改行を含む)を与え、残りの47文字は与えます。

10

投稿されたプログラムは、ポートの状態について多くの仮定を行っています。実際のアプリケーションでは、すべての重要な設定を明示的に行う必要があります。 POSIXでシリアルポートプログラミングを学ぶための最良の情報源は

POSIXオペレーティングシステムのシリアルプログラミングガイド

ここでそれをミラーリングしています: https://www.cmrr.umn.edu/~strupp/serial.html

8
datenwolf