ゼミのお話/ロボット工学者養成所/要素別/シリアル通信

2018-04-16 (月) 15:53:00 (844d)

プログラミング関係

構造体struct termios

構造体struct termiosの定義

  • struct termiosはシリアルポートを含む汎用ターミナルインタフェースの設定を扱う構造体であり,定義は以下のようになっている.
    • struct termios {
      • tcflag_t c_iflag; /* 入力フラグ */
      • tcflag_t c_oflag; /* 出力フラグ */
      • tcflag_t c_cflag; /* 制御フラグ */
      • tcflag_t c_lflag; /* ローカルフラグ */
      • cc_t c_cc[NCCS]; /* 特殊制御文字の設定 */
    • };
  • 入力フラグ
    • 端末(この場合armadillo)への入力に関する設定である.特に文字入力の仕方(入力の8ビット目を落とす,パリティ検査を行うなど)を制御する.
  • 出力フラグ
    • 端末(この場合armadillo)からの出力に関する設定である.特に出力処理の実行の仕方(改行をCR/LFに変更するなど)を制御する.
  • 制御フラグ
    • 端末(この場合armadillo)のハードウェアに関する設定である.RS-232のシリアルライン(モデムの状態信号の無視,文字ごとのストップビット数など)に影響する.
  • ローカルフラグ
    • 端末(この場合armadillo)のその他の設定である.ドライバとユーザのインターフェース(エコーのオン/オフ,削除した文字の表示方法,端末生成シグナルの有無,バックグラウンドからの出力を止めるジョブ制御シグナルなど)に影響する.

基本的な使い方

  • tcgetattrにてプログラム開始時の初期設定を読み込む
  • new = old などとして初期設定と同じ新しい設定変数を作成し,以後新しい設定変数を使う
  • cfsetspeedなど必要に応じて必要な箇所のみの変更を行う
  • 通信処理
  • プログラム終了時に初期設定に戻す

入力データの取り扱い

入力方式と処理方法

  • シリアルデバイスにおいてデータの入力はread関数によって行われる.この時,read関数が受け取るデータの単位と受け取る時の処理に幾通りかの方法がある.受け取るデータの単位に関する方法として,カノニカル入力処理と非カノニカル入力処理がある.また受け取る時の処理方法として,同期処理と非同期処理がある.
カノニカル入力処理非カノニカル同期処理
同期処理カノニカル・同期非カノニカル・同期
非同期処理カノニカル・非同期非カノニカル・非同期

カノニカル・非カノニカル入力方式

  • カノニカル入力処理(デフォルト)
    • 外部からの全ての入力は,行単位で処理される.つまり,readによって得られるデータは1行全体である.よってデータは以下のいずれかで終わる.

      NL(ASCIIのLF)

      ファイル終端

      行終端文字

      注意点としては,標準の設定ではCR(DOS/Windowsのデフォルトの行終端文字)は行終端とはならない.

  • 非カノニカル入力処理
    • read関数を呼び出す際に読み込むデータの大きさを指定する方法である.特に,プログラムが決まった文字数のキャラクタを読み込む時や,接続したデバイスが大量の文字を送ってくる場合に使用する.

同期・非同期処理

  • 同期処理
    • read関数にてデータ読み込みが始まると,データを読み終えるまでプログラムの処理は中断される.つまりデータが読み込まれるまで待つ.
  • 非同期処理
    • read関数にてデータ読み込みが始まると,プログラム自体はread関数の次の行から処理が再開される.つまり,データが読み終えるまで待たずに,次の処理が続行される.データ読み込みが終わるとシステムがプログラムにシグナル(信号・合図)を送るしくみとなる.