2011年11月22日火曜日

termios.hについて

termios.hはLinux標準のシリアル通信用Cライブラリ.シリアル通信用の構造体termiosが定義してある.termios構造体にはメンバとして通信速度やキャラクタ長,ストップビットなどの通信設定が格納される.シリアルポートに相当するファイルは "/dev/ttyS0" とか,USB-シリアル変換を使ってると "/dev/ttyUSB0" になったりする.変換はだいたいPL-2303チップで,Linuxだと標準でドライバを持ってることが多い.要するに刺すだけでudevが対応するファイルを生成してくれて,使えるようになる.

簡単な使用手順

  1. シリアルポートに相当するファイルをopen()で開く.fopen()じゃなく,低水準入出力を使う.そのためファイルポインタじゃなく,ファイルディスクリプタが返ってくる.こいつはint型.エラーのときは負の値になってる.
    ※ この時点で失敗するときはだいたいパーミッションが原因.上記仮想ファイルのパーミッションを666とかに設定しとくこと.パーミッションは再起動とか変換アダプタの抜き差しでリセットされる(ファイルが再生成されるから)ので,その都度設定するか,udevの設定ファイルをいじくっておく.
  2. tcgetattr()を使って現在の通信設定を適当に宣言したtermios構造体に退避する.
  3. 2.で使ったやつとは別のtermios構造体に必要な設定を行う.メンバは単に値を代入するものと,各ビットがフラグとなっているものがある.詳細は"termios 設定"とかで調べる.
  4. tcflush()でポートをクリアしてから,tcsetattr()で設定を適用する.
  5. write()で出力する.
  6. read()で応答を読み込む.接続機器の設定によるけど,応答の末尾1, 2文字は多分改行コード.これは'\0'に置き換えた方が幸せだと思う.
  7. tcsetattr()で退避しておいた設定を復帰させてから,close()でファイルを閉じる.

その他注意事項とかメモとか

  • カノニカルモードと非カノニカルモードがあるけど,カノニカルモードの動作がよく分からなかった.というか,カノニカルモードで安定して動作させることができなかった….
  • パーミッション周りは自分のようなLinux初心者がよくはまると思う.まずは権限を疑うこと.
  • termios構造体のメンバのビットを操作して設定する,というのがちょっと分かりにくかった.マイコンのプログラミングやってるとすぐに把握できるんじゃないかと思う.
  • 通信するだけならすでにツールがいろいろあるので,そっちを使った方が幸せ.

0 件のコメント:

コメントを投稿