ページ

Clip to Evernote ←このページをノートに保存する
Add to Google ←このブログをGoogleに追加

2010年7月21日水曜日

LinuxでRS-232CやRS-422などのttyポートをrawモードに設定する

RS-232CやRS-422などのシリアルポートは、デバイスドライバを介してttyポートとして扱われることが多い。ttyポートは、本来VT100などのダム端末を接続するポートとして設計されており、テキストデータの送受信を行うことを前提に設計されている。しかし、RS-232Cは、いまだに多くのデスクトップパソコンに標準で採用されていることから、RS-232C経由でバイナリデータの送受信を行うセンサー類は多い。また、RS-422はケーブルを比較的長くしてもノイズに強く、安定した通信が行えることから、FA用途で広く使われてきたこともあり、RS-422経由でバイナリーデータを送受信する測定器類の種類は豊富である。

ttyポートを使って、バイナリデータの送受信を行おうとすると、ttyポートをrawモードに設定する必要がある。しかし、最近のLinuxを含むUNIX関連のドキュメント類では、ttyポートをrawモードに設定する方法は明確に示されていない。古いドキュメントには、MS-DOSに言及しながら"バイナリモード"という表現で記述されているものがあるが、これらの多くはすでに最新のライブラリからは消し去られてしまった定義を用いており、そのまま使うことはできない。しかも、比較的新しいドキュメントの中には、Linuxではテキストデータもバイナリデータも全く同じに扱えると言い切っているものさえある。
しかし、実際にrawモードの設定を行わず、バイナリーデータを送受信しようとすると、多くの場合不具合が起きる。例えば、INTR, QUIT, SUSP, DSUSPなどの特殊文字をデバイスドラが受け取ると、それぞれに対応したシグナルを発生する。すると、受信したはずのデータが途中で切れたり、別のデータに化けるような症状として現れる。このモードはrawモードに対してcoockedモードと呼ばれており、テキストデータを端末の画面に表示しながら通信することを前提にしたモードである。
これらの端末に対する振る舞いは、termios構造体の中で定義されている。したがって、ttyポートをopenした後データの送受信を行う前に、対応するファイルディスクリプタのtermios構造体の中身を設定する必要がある。
termios構造体の中身を見ると、設定しなくてはならない項目は極めて多い、これらを1つずつ、バイナリーテータを通しても問題ないように考えながら設定していくのは、ミスも多く面倒な作業である。これらの作業を簡単にするために、cfmakeraw() がある。cfmakeraw() は、termios構造体の中で、rawモードに必要な設定をしてくれる。これは関数ではなく、マクロとして実現されている。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/termios.3.html#lbAH

0 件のコメント:

コメントを投稿