ゼミのお話/ロボット工学者養成所/要素別/シリアル通信
2018-04-16 (月) 15:53:00 (1007d)
プログラミング関係 †
構造体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]; /* 特殊制御文字の設定 */
- };
- struct termios {
- 入力フラグ
- 端末(この場合armadillo)への入力に関する設定である.特に文字入力の仕方(入力の8ビット目を落とす,パリティ検査を行うなど)を制御する.
- 出力フラグ
- 端末(この場合armadillo)からの出力に関する設定である.特に出力処理の実行の仕方(改行をCR/LFに変更するなど)を制御する.
- 制御フラグ
- 端末(この場合armadillo)のハードウェアに関する設定である.RS-232のシリアルライン(モデムの状態信号の無視,文字ごとのストップビット数など)に影響する.
- ローカルフラグ
- 端末(この場合armadillo)のその他の設定である.ドライバとユーザのインターフェース(エコーのオン/オフ,削除した文字の表示方法,端末生成シグナルの有無,バックグラウンドからの出力を止めるジョブ制御シグナルなど)に影響する.
基本的な使い方 †
- tcgetattrにてプログラム開始時の初期設定を読み込む
- new = old などとして初期設定と同じ新しい設定変数を作成し,以後新しい設定変数を使う
- cfsetspeedなど必要に応じて必要な箇所のみの変更を行う
- 通信処理
- プログラム終了時に初期設定に戻す
入力データの取り扱い †
入力方式と処理方法 †
- シリアルデバイスにおいてデータの入力はread関数によって行われる.この時,read関数が受け取るデータの単位と受け取る時の処理に幾通りかの方法がある.受け取るデータの単位に関する方法として,カノニカル入力処理と非カノニカル入力処理がある.また受け取る時の処理方法として,同期処理と非同期処理がある.
カノニカル入力処理 | 非カノニカル同期処理 | |
同期処理 | カノニカル・同期 | 非カノニカル・同期 |
非同期処理 | カノニカル・非同期 | 非カノニカル・非同期 |
カノニカル・非カノニカル入力方式 †
- カノニカル入力処理(デフォルト)
- 外部からの全ての入力は,行単位で処理される.つまり,readによって得られるデータは1行全体である.よってデータは以下のいずれかで終わる.
NL(ASCIIのLF)
ファイル終端
行終端文字
注意点としては,標準の設定ではCR(DOS/Windowsのデフォルトの行終端文字)は行終端とはならない.
- 外部からの全ての入力は,行単位で処理される.つまり,readによって得られるデータは1行全体である.よってデータは以下のいずれかで終わる.
- 非カノニカル入力処理
- read関数を呼び出す際に読み込むデータの大きさを指定する方法である.特に,プログラムが決まった文字数のキャラクタを読み込む時や,接続したデバイスが大量の文字を送ってくる場合に使用する.
同期・非同期処理 †
- 同期処理
- read関数にてデータ読み込みが始まると,データを読み終えるまでプログラムの処理は中断される.つまりデータが読み込まれるまで待つ.
- 非同期処理
- read関数にてデータ読み込みが始まると,プログラム自体はread関数の次の行から処理が再開される.つまり,データが読み終えるまで待たずに,次の処理が続行される.データ読み込みが終わるとシステムがプログラムにシグナル(信号・合図)を送るしくみとなる.