コンピュータで使用できるI/Oポート
シリアルポート 編
Mar. 7, 2001.
1.シリアル通信とパラレル通信の違い
- パラレル通信
セントロニクスインタフェース(いわゆる『パラレルポート』)、
GPIBインタフェース、SCSIインタフェースなど
複数のデータ(複数bit)を同時に送信するため、高速。
多数本のケーブルが必要。コスト高、長距離通信に難。
- シリアル通信
RS-232C(EIA-232)、Ethernetなど
転送データを直列データに分解して送信、受信後、再度組み立て直す。
最低3本の電線で送受信が可能。
通信速度、形式を合わせれば、機器に依存しない通信が可能。
データ送受信が1bit幅しかないので、通信に時間がかかる。
2.シリアルポートの概念・仕組み
[1] シリアルポート(RS-232C ポート)とは
シリアルデータを送受信するI/O デバイス。
パソコンなどの端末(DTE; Data Terminal Equipment)とモデムなどの終端装置
(DCE; Data Communication Equipment)間の通信、DTE間の通信に
用いられる。
1969年、米国EIA(Electronics Industries Association; 米国電子工業会)
により規定。RS(Recommended Standards)-232C、EIA-232-D、EIA-232-E。
ツイストペア技術を使っていないため、現在となっては、
遅く(一般的に115.2 Kbpsまで)、伝送距離が短い(〜15m)規格だが、
歴史的には広く使用されてきている。
[2] 概念
PCなどからのparallel(並列)データ(=byte単位)入力を、serial(直列)データ
(=bit 単位)に変換して出力。受信側では、受信データを逆の手順でserilalから
parallelデータに変換する。
- UART(Universal Asynchronous Receiver Tranmitter)
- シリアル通信専用chip
- byte data(parallel date)とbit stream(serial data)の変換
- 信号電圧変換
- 制御用bitの追加
を担う。
ダムUART(buffer 1byte) 8250、16450、初期型16550、初期型16650
FIFO UART 16550、16550A、16c552、16650、16750、16c950
などがある。
最近のPCでは16550A(16byte bufferあり)が一般的。
シリアルポートには、
- I/O address <-> name (/dev/ttyS0、/dev/ttyS1、...)
- IRQ(Interruput ReQuest number):割り込み番号
が割り当てられる。
割り込みは、以下のような時に生じる。
- FIFO bufferが一定量のデータを受け取った(もうすこしで溢れる)とき。
- timeout(一定時間データのやり取りがなかったとき)
- bufffer dataの送信終了時
- 制御線の状態変化時
割り込み信号では「何が起こったか」はCPUに知らせることができない。
「何かが起こった」ということのみ通知する。
割り込み信号によってCPUは「割り込みサービスルーチン」を実行し、
シリアルポートの状態を保持するレジスタを読んで、シリアルポートに
何が起こったかを知り、適切な処置を実行する。
[3] 規格
本来の規格は25pinコネクタを使用する(別表)。
実際のパソコン/ワークステーションでは、そのうちの9線を使用
するのが一般的。
基本 x 3線
- TxD : 送信データ(Transmitted Data)
- RxD : 受信データ(Received Data)
- GND : GND
制御線 x 6線
- RTS : 送信要求(Request To Send)
- CTS : 送信可能(Clear To Send)
- DSR : Data Set Ready
- DTR : Data Terminal Ready
- DCD : Data Carrier Detect
- RI : Ring Detect
制御線の使用についてはドライバやソフトに委ねられている。
汎用I/O(±12V)として使用することも可能。
多くの場合、基本3線(TxD、RxD、GND)が使用され、時にフロー制御のために
(RTS、CTS)も使用される。
結線はDTEとDCE(パソコンとモデムなど)の場合はストレートケーブルを用い、
DTE同士(パソコン間)の場合はクロスケーブルを用いる。
結線図
電気特性は以下の通り。
TTLと異なり一般に±12Vが主なので注意が必要。
TxD、RxD : 反転論理
- +12V : 0, space
- -12V : 1, mark
その他制御線: 反転論理
- -12V : 0, space
- +12V : 1, mark
信号の内容
1byteにつき、以下の各ビットがTxDに送信される。
- idle : 1(=mark) ; データ未送信状態
- startbit : 0(=space) ; データ送信開始
- data : 0 or 1 ; 下位ビットから順にデータ送信(7 or 8 bits)
- parity bit : 0 or 1 ; パリティビット。送受信のエラーをチェックする
- stop bit : 1 ; 送信の終了
- idle : 1 ; 次のバイトデータ送信(startbit)を待つ
parity bit
- even : data bitとparity bitの全bitで"1"が偶数になるようにセット
- odd : data bitとparity bitの全bitで"1"が奇数になるようにセット
- なし : parity bit なし
- space : 常にparity bitが0(=space)
- mark : 常にparity bitが1(=mark)
即ち、一連のデータは、
start bit(1 bit) + Data(7 or 8 bits) + Parity bit(0 or 1 bits)
+ stop bit(1 or 2)
の計9-11bits(12bit以上は不可)から構成される。
この一連のデータをフレームと呼ぶ。
bit列図
非同期(調歩同期)通信と同期通信
ここに述べた通信は、送信側のstart bitを受けて、受信側は
各bitの送信に同期してサンプリングを行ない、bit列を読む。
1byte分(stop bit)まで読み込んだら、次のstart bitを待つ。
1byte分のデータを読む間は送信側と受信側の同期が必要なものの、
複数のbyte間では同期はとられていない。このような通信を
非同期(調歩同期)通信と呼ぶ。
一方、クロック専用線を用い、途切れなく送受信を同期して行なう
通信を同期通信と呼ぶ。
EIA-232の規格では両者定義されているが、PCのポートでは
同期通信用のピンは一般に省略されているので、同期通信は
使用することはできない(PC-98には残されている)。
break信号
TxDを長時間(1/4〜1/2 sec) 「space」で維持することで、「break」信号となる。
通信線のリセット、通信モード変更などに利用する。
フロー制御について
送信速度が受信速度を上回った場合、受信側のbufferが溢れてしまう
可能性がある。それに備えて、バッファーが溢れる前に、送信側に
送信を一時停止することを要求できる。これがフロー制御である。
フロー制御には、以下の2通りがある。
- ソフトウェアフロー制御
ASCII制御文字
- DC1(XON; 021@8進) : start
- DC1(XOFF; 023@8進) : stop
を使用する。データストリームの中に挿入されるので、反応が遅くなる。
(時に制御文字でオーバーフローを起こす危険がある)。また、特殊な
方法を用いないと、バイナリデータの送受信ができない。
- ハードウェアフロー制御
制御線 CTS、RTSを使用する。
- DCEからDTEへの送信(eg. モデム-> PC)を止めたいとき
-> DTEの RTS を OFF -> DCEがRTSのOFFを受け取り、DTEへの送信を止める
- DTEからDCEへの送信(eg. PC -> モデム)を止めたいとき
-> DCEの CTS を OFF -> DTEがCTSのOFFを受け取り、DCEへの送信を止める
高速で確実。
2.Serial Port使用の実際
UNIX(Solarisなど)でRS-232Cポートを使用する場合の実際の手続きは
以下の通りである。
[1] Port Device Files
RS-232Cポートは、以下のようなデバイスファイルに対応している。
これらのファイルに読み書きの許可を与える。
[2] Serial Port を開く
システムコール int open(device file name, flag) を使用する。
(例)
fd = open( "/dev/ttyb", O_RDWR | O_NOCTTY | O_NDELAY );
device file nameにはシリアルポートのデバイス名を入れる。
flagには、deviceを開く際のオプションを入れる。
[3] Serial Port の初期設定を行なう
構造体 termioの各メンバに、対応する値を入れる。
DCEの通信設定を知らなければならない。
termioのメンバ
- c_cflag
Control Options
基本的な制御設定。
baud rate(通信速度)、キャラクタ長、パリティの設定、フロー制御など
- c_lflag
Line Options
raw/canonical 通信の選択、エコー制御など
- c_iflag
Input Options
入力時の設定。
パリティの有効・無効、ソフトウェアフロー制御の有効・無効、
行末信号のmapping
- c_oflag
Output Options
出力後のディレイ(遅れ時間)の設定
- c_cc
Control Characters
制御用文字の設定、タイムアウトの設定
参考資料
秋田谷 洋
(akitaya@astr.tohoku.ac.jp)