シリアル通信

Serial communication

概要 Abstract
このページ(章)では通信の基本であるシリアル通信について解説する.
In this page (chapter), explain serial communication of basic communication.
目次 Table of contents

通信について About communication

ロボティクス講座には様々なロボットや,センサが存在するが, これらを利用する際には,必ず通信が必要である. たとえば,ロボットを動かすためには,命令を送信する必要があり, センサの情報を得るためには,受信する必要がある. このほかにも,通信は,私たちの身の周りの見えないところで利用されている. 本章では,シリアル通信に関する簡単なプログラミングを通して,理解を深めて行こう.

Robotics lecture has various robots and sensor exists, and when you use these, communication is required definitely. For example, it is necessary to transmit command to operate robot, and it is necessary to receive to obtain information of sensor. In addition, communication is used in invisible place around our body. In this chapter, let's deepen understanding through simple programming about serial communication

シリアル通信について About serial communication

シリアル通信とは About serial communication

シリアル通信とは,一本の信号線で1ビットずつデータの受け渡しを行う通信のことである. 想像しやすい例としては,モールス符号による通信を思い浮かべると良い. ちなみに,モールス符号による通信では,ONとOFFの信号(つまり1か0)を一本の伝送線上で送信する. このON,OFFの組み合わせを利用することで,意味のある通信を行っている.

Serial communication is communication performing data passing by 1 bit with one signal conductor. As easy example to imagine, you should remember communication by Morse code. By the way, for communication by Morse code, transmit signal of ON and OFF(in other words 1 or 0) on one transmission line. In using combination of this ON,OFF, it performs meaningful communication.

これに対し,複数の伝送線を用いて同時に多ビット通信を行うものを,パラレル通信という.

In contrast, parallel communication is using plural transmission line to perform multi-bit communication at the same time.

パラレル通信はクロックごとに送信できるデータ量が大きいので,シリアル通信のほうがパラレル通信より伝送速度が遅いと想像されがちである. しかし,パラレル通信は複数の伝送線間でクロックのずれを無くすための同期処理が必要であったり, シリアル通信は,高クロック化が容易であるため,高データ転送レートが実現でき, 結果的に低コストで高速データ通信が可能になっている. このほかにもシリアル通信を用いる利点が存在するが,割愛する.

Because parallel communication can transmit big data volume by every clock, it is apt to be thought that serial communication is slower than parallel communication when it comes to line speed. However, parallel communication need synchronous process to eliminate clock gap between plural transmission line, and as serial communication is easy to become high clock, high data transfer rate can be realized, and as a result, high speed data transmission is enabled at low cost. Advantage with serial communication exists in addition, but omit it here.

シリアル通信を行っているアーキテクチャ Architecture that is performing serial communication

シリアルポート
シリアルポート
Serial port
Serial port

計算機にシリアルポート(図中:左上)を見なくなって久しいが, 実は,形を変えて存在している. 現在,利用されているシリアル通信のアーキテクチャには,以下のものが存在する.

It is a long time since look serial port with computer(figure: upper left), but in fact, it changed form and exist. Now, the following exists for architecture of used serial communication.

  • USB(Universal Serial Bus)
  • FireWire
  • Bluetooth
  • Ethernet
  • MIDI
  • シリアルATA Serial ATA
  • 等々 etc.

この中でUSBを使ったものが最も普及しており,(図中:下)のようなUSBやBluetoothといったインターフェイスを介して, シリアル通信を行うことができる. その中で,USBをシリアルポートへ変換する変換器を利用して通信を行うこととする(図中:下).

Among these, things using USB are spreading most, and serial communication is available via interface of USB and Bluetooth like (figure: bottom). From these, communicate using converter which converts USB into serial port (figure: bottom).

シリアル通信の通信プロトコルについて About communication protocol of serial communication

通信プロトコル Communication protocol

シリアル通信は,基本的にシリアルポートでの通信規格「ANSI/TIA/EIA-232-F-1997」(呼称=RS-232C)に基づいている. 通信するためには,まず,ボーレート(Baud Rate),データ長,パリティーチェック,ストップビットを設定しておく必要がある. これらは,利用するデバイスによって決められているので,説明書などを参照し,通信設定を行う. この設定を怠ると,正しい通信が行えないので注意が必要である.

Basically, serial communication is based on communication standard "ANSI/TIA/EIA-232-F-1997" (name = RS-232C) with serial port. To communicate, it is necessary to set baud rate (Baud Rate), data length, parity check, stop bit at first. Because these are decided by device to use, refer to manuals, to perform communication setting. It is not possible for correct communication if neglect this setting, so attention is required.

主な通信設定の名称
Name of main communication setting
ボーレート(Baud Rate)通信速度(bps)
データ長データの長さ(byte)
パリティチェック伝送誤りの検出
ストップビットデータの終わり(1,1.5,2bit)
Baud RateTransmission rate (bps)
Data lengthLength of the data (byte)
Parity checkDetection of transmission error
Stop bitEnd-of-data (1,1.5,2bit)

次のセクションは,詳細について述べる.そのため,読み飛ばしても構わない.

The following section describes the details. Therefore, you may skip it.

各用語の説明 Description of each vocabulary

シリアル通信のイメージ
シリアル通信のイメージ
Image of serial communication
Image of serial communication

シリアル通信は,図のようなイメージになる.

Serial communication is like figure image.

左から順番に通信路に出力していく.
図中の1マスを1ビットとして表現している.
つまり,0または1がそれぞれのマスに入ることになる.
最初はスタートビット,次にデータビット,パリティビット,ストップビットと送信される.
これで1バイトが送信が行われていることになる.
  • スタートビット Start bit
     スタートビットは常に0である.
     スタートビットは,データがこれから送信されることを示している.
     スタートビットを確認した際,その時点でリセットし,ボーレートで指定された間隔でデータの取り込みが行われる.
  • データビット Data bit
     データビットは,通信を行う機器間で予め規定しておく必要がある.
     ほとんどの場合,7ビットまたは8ビットである.
  • パリティビット Parity bit
     伝送誤りを検出する.
     パリティチェックは誤りを検出するだけで,誤り訂正はできない.
     ハードウェア側で勝手に計算が行われるため,私たちがプログラムする必要はない.
  • ストップビット Stop bit
     ストップビットは常に1である.
     ストップビットは通信が終了することを示している.
     このビット数は、1ビット、1.5ビット、2ビット等が存在する.

シリアル通信プログラムの実装について About implementation of serial communication program

シリアル通信プログラムでは,特に以下の6つの要素が重要だ:

For serial communication program, six following elements are in particular important:

File Descriptor(ファイル・ディスクリプタ)

File Descriptor( file discriptor)

  • オープン中のファイルの詳細を記録しているデータ構造へのインデックス(整数値)が保存されている. Index (integer value) to data structure, recording the details of opening file, is saved.
  • int fd; で定義することが多いようだ. It seems that often defined at int fd;.
  • 因に, 0 は標準入力 (stdin) , 1 は標準出力 (stdout) , 2 は標準エラー出力 (stderr) である. 0 is standard input (stdin), 1 is standard output (stdout), 2 is standard error output (stderr).

int open(const char \*pathname, int flags);

  • pathname であるファイルをオープンする. Open file which is pathname.
  • open() に成功した場合は,ファイル・ディスクリプタを返す. When you succeed in open(), return file discriptor.
  • open() に失敗した場合は -1 が返される. When you fail in open(), -1 is returned.
  • パラメータ flags には O]]RDONLY (読み込み専用), O_WRONLY (書き込み専用), O_RDWR (読み書き) を設定する. Set O]] RDONLY (read-in only), O_WRONLY (write only), O_RDWR (read/write) in parameter flags.

int close(int fd);

  • ファイル・ディスクリプタをクローズする. Close file discriptor.
  • close() に成功した場合は 0 が返される. When you succeed in close(), 0 is returned.
  • close() に失敗した場合は -1 が返される. When you fail in close(), -1 is returned.
  • 適切に close() しなかった場合,そのファイル・ディスクリプタに関連したリソースが解放されないため,不適切な処理が行われる可能性がある. If do not perform close() appropriately, because resource in relation to the file discriptor is not released, inappropriate process may be performed.

ssize_twrite(int fd, const void \*buf, size t count);

  • ファイル・ディスクリプタに書き込む. Write in it at file discriptor.
  • buf が指すバッファから,ファイル・ディスクリプタ fd が参照するファイルへ,最大 count バイトを書き込む. Write in it at file discriptor.
  • write() に成功した場合,書き込まれたバイト数が返される ( 0 は何も書き込まれなかったことを示す). When succeed in write(), number of bytes written is returned (0 shows that nothing was written).
  • write() に失敗した場合 -1 が返される. When fail in write(), -1 is returned.

ssize_t read(int fd, void \*buf, size t count);

  • ファイル・ディスクリプタから読み込む. Read from file discriptor.
  • ファイル・ディスクリプター fd から最大 count バイトを buf で始まるバッファーへ読み込もうとする. Try to read max count byte from file descriptor fd to buffer beginning with buf.

termios関数群

termios functions

  • termios では,シリアル通信を行う際に必要となる ボーレート(Baud Rate)データ長パリティーチェックストップビット と言ったターミナル属性を設定したり取得したりする. For termios, set and acquire terminal attribute such as Baud rate (Baud Rate), data length, parity check, stop bit, required at serial communication.

termios 構造体 termios structure

termios 構造体とは,termios関数群に渡すターミナル属性値を格納する構造体である.

termios structure is structure, which stores terminal attribute value to hand to termios functions.

termios 構造体の要素:

Element of termios structure:

 tcflag_t c_iflag;     /* input modes   */
 tcflag_t c_oflag;     /* output modes  */
 tcflag_t c_cflag;     /* control modes */
 tcflag_t c_lflag;     /* local modes   */
 cc_t     c_cc[NCCS];  /* control chars */

ボーレート=19200,データ長=8bit,パリティーチェック=無視,ストップビット=1(default)で設定を行った場合のサンプルプログラム:

Sample program when you set with Baud rate = 19200, Data length =8bit, Parity check = ignored, Stop bit =1(default):

  struct termios ios;
  // Setting
  tcgetattr(fd, &ios);
  ios.c_cflag = B19200 | CREAD | CLOCAL | CS8;
  ios.c_iflag = IGNPAR;
  ios.c_oflag = 0;
  ios.c_lflag = 0;
  ios.c_cc[VMIN] = 0;
  ios.ccc[VTIME] = 0;

  if( tcsetattr(fd, TCSANOW, &ios) < 0 )
  {
      perror("tcsetattr");
      return false;
  }
  return true;

ほかにも多数の関数が用意されているので,必ず man termios コマンド等を利用して調べてみること.

Because a large number of functions are prepared elsewhere, examine using man termios commands definitely.

シリアル通信モジュールの作成 Creation of serial communication module

シリアル通信を扱うモジュール(クラス)を作成する.

Create a module (class) handling serial communication.

インターフェイスクラス Interface class

あるプログラムからシリアル通信を行うとき,以下のような手順で行われる::

When performing serial communication from a certain program, perform following procedures ::

  1. 通信ポートのオープン: 通信ポートを開き,通信速度などの設定う Opening of communication port: Open up communication port, to set such as transmission rates.
  2. データを書き込んだり,読み込んだりする Write and read data.
  3. ポートのクローズ Port close
    通信ポートをオープンする関数やクローズする関数は,シリアル通信ドライバによって異なっている場合もあるが(例えば KHR-2 用制御ボード RCB-3 など),この手順についてはほとんどすべてのタイプのシリアル通信で共通だ.そこで,基本的な機能に関するインターフェイスを,以下のような仮想関数を持つクラスとして作成する:
    Function to open/close communication port may be different depending on serial communication driver (for example, control board RCB-3 for KHR-2), but this procedure is common in almost all types of serial communications. Then, create interface about basic features as class having the following virtual functions:
  class TComBase
  {
  private:
  protected:
  public:
    TComBase(void)  {};
    virtual ~TComBase(void) {};
    virtual bool Open(void) = 0;
    virtual bool Close(void) = 0;
    virtual int Write(const void *buff, size_t size) = 0;
    virtual int Read(void *buff, size_t size) = 0;
  };

Open, Close はそれぞれ通信ポートを開いたり閉じたりする関数で,ポートの開閉に成功すれば true, 失敗すれば false を返す関数である. Write は buff から始まる size バイトのデータ列を書き込む関数, Read は buff に size バイトのデータを読み込む関数である.

Open/Close are function that open/close communication port, and it is functions that returns true if succeed in opening and shutting of port, and returns false if failed. Write is function which writes in data row of size byte beginnig with buff. Read is function which read data of size byte in buff.

シリアル通信クラス Serial communication class

作成した TComBase を派生させて,一般的なシリアル通信クラス TSerialCom を作成する.主に必要な作業は, Open, Write などの仮想関数をオーバーライドして実装すること,及び固有の通信速度などを設定する関数の実装である. TSerialCom クラスの具体的な設計は次のようになる:

Derivate created TComBase, and create general serial communication class TSerialCom. Mainly required work is to override and implement virtual functions such as Open, Write, and to implement function to set peculiar transmission rates. Concrete design of TSerialCom class is as follows:

  class TSerialCom : public TComBase
  {
  private:
    int fd;
     std::string s_tty;
     struct termios s_ios;
    TSerialCom(const TSerialCom&);
    const TSerialCom& operator=(const TSerialCom&);
  public:
    TSerialCom(void) : TComBase(), fd(-1) {};
    ~TSerialCom(void) {};
  void setting(const std::string &_tty, const termios &_ios)
  {s_tty=_tty; s_ios=_ios;};
    bool Open(void);
    bool Close(void);
   int Write(const void *buff, size_t size);
   int Read(void *buff, size_t size);
  };

単純に TComBase クラスを public 継承し, Open などの仮想関数をオーバーライドしている. setting は設定のための関数で,通信ポート名 ("/dev/ttyS0" など) と termios 構造体(通信設定を記述)を指定する. private メンバとしてファイル・ディスクリプタ fd などを保持するようにしている.

public succeeds TComBase class simply, and perform overriding of virtual functions such as Open. setting is function for setting, and is to specify communication port name ("/dev/ttyS0" etc.) and termios structure (describe communication setting). It holds file discriptor fd etc. as private member.

ライブラリ Library

Serial通信クラス,それを利用したアクトロイド制御クラス,KHR-2制御クラスなどは,Robotics講座SVNリボジトリにアップされている.

Serial communication class, Act Lloyd control class using it, KHR-2 control classes and so on are uploaded at Robotics lecture SVN repositry.

SVN+SSH:  svn+ssh/アカウント@robotics/home/svn/svn/khr2_actroid_serial
ブラウズ:  https://robotics.naist.jp/~svn/websvn/ の khr2_actroid_serial

CheckOutして,サンプルを動かしてみよう.

Perform CheckOut to operate sample.

サンプルプログラム Sample program

0x0D 0xAA を送信して終了するプログラム

Program to transmit 0x0D 0xAA and finish.

main.cpp :

  #include "Serial.h"
  #include <iostream>
  using namespace std;
  using namespace loco_rabbits;
  struct Header
  {
    unsigned char COM,OPT;
    Header(void) : COM(0x0D),OPT(0xAA) {};
  };
  /**
   * main
   * \param int argc
   * \param char **argv
   */
  int main(int argc, const char **argv)
  {
  const size_t BufferSize(10);
  TSerialCom serial_com;
    if (argc!=2)
    {
      cerr<<"please set serial com port path!"<<endl;
      return 1;
    }
    string tty(argv[1]);
    termios ios;
    memset(&ios, 0, sizeof(ios));
 ios.c_cflag |= B115200 | CREAD | CLOCAL | CS8;  /* control mode flags */
 ios.c_iflag |= IGNPAR;  /* input mode flags */
 ios.c_cc[VMIN] = 0;
 ios.c_cc[VTIME] = 2;  // *[1/10 sec] for timeout
 serial_com.setting (tty, ios);
 serial_com.Open();
    unsigned char* buffer;
    buffer = new unsigned char[BufferSize];
    Header head;
    memcpy(buffer, &head, sizeof(head));
 serial_com.Write(buffer, 2);
 serial_com.Close();
    if (buffer) delete buffer;
    buffer=NULL;
    return 0;
  }

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-03-13 (水) 08:04:58 (1955d)