(本章の多くの部分は Serial-HOWTO に書かれています) Unix 系のシステム (で PC 上で動作するもの) でのテキスト端末は、コンピュータの非同期 232 シルアル通信ポートに接続し、普通は RS-232-C, EIA-232-D, または EIA-23 2-E を使います。これら 3 つはほぼ同じものです。始めはプレフィクスとし て RS を使ってしましたが、 EIA (Electronics Industries Association) と なり、EIA と TIA (Telecommunications Industries Association) が統合さ れた後は EIA/TIA となりました。EIA-232 仕様は同期 (sync) 通信について も規定していますが、ほとんどの PC には同期通信をサポートするハードウェ アが装備されていません。RS はもはや古い名称ですが今だに使われています。 本書では EIA を使用することにします。
コンピュータや端末の背面に一つ以上のシリアルポートがあります。それには 電子部品が組み込まれていて、EIA-232 仕様に準拠した信号を生成します。標 準的なコネクタは 25 ピンで、ほとんどのピンは未使用です。代りに 9 ピン だけのコネクタもあります。あるピンはデータの送信用として、別なピンは受 信のために使われます。他のピンは信号グランドです。それ以外の ``有用な'' ピンは ``オフ'' を意味する安定した負電圧と ``オン'' を意味する安定し た正電圧により、主として信号処理の目的に使われます。
UART (Universal Asynchronous Receiver-Transmitter 汎用非同期送受信器) チップが通信のほとんどの仕事をこなします。今日、このチップの機能は他の チップに組み込まれています。
EIA-232 準拠のシリアルポートでは、電圧は二極式 (接地電圧に対し正または 負) であり、その絶対値は 12V です (5V や 10V のものもあります)。送信ピ ンと受信ピンでは +12V が 0 を表すビット (``スペース'' と呼ばれることも あります) で、-12V が 1 を表すビットです (``マーク'' と呼ばれることも あります)。これは負論理として知られています。というのも、普通は 0 を表 すビットは偽かつ負であり、1 は真と正を表すからです。送信ピンと受信ピン は負論理ですが、他のピン (モデム制御線) は通常の論理を用いており、正の 電圧が真 (または ``オン'' または ``アサート'' ) であり。負の電圧が偽 (または ``オフ''または ``否定'') を表します。電圧 0 は意味を持ちません (その機器の電源が切れているという意味だけは持ちます)。
電圧に範囲を持たせることもできます。仕様においては、送信される信号の絶 対値は 5V と 15V の間でなければならず、25V を越えてはなりません。3V 未 満の電圧は未定義です (ただし、デバイスによっては電圧が低くても有効であ るとして受け付けます)。電圧はたいてい 11-12V なのですが、「一般的に 5V (あるいは 3V) である」とする誤りをときどき見かけます。ただし、Mac コ ンピュータの EIA-422 ポートを EIA-232 (特殊なケーブルが必要) や EIA-42 3 としてお使いならば、電圧はまさしくわずか 5V のはずです。ここでの説明 では 12V を使うものとします。インターネットで使う電圧はさらに混乱して います。
通常のコンピュータの論理回路は数 V (かつては 5V が標準だったこともあり ますが) しか使わないので、3-5V のコンピュータ回路 (TTL) の試験用に設計 されたテスト機器を 12V のシリアルポートに対して用いると、テスト機器が 壊れてしまうことがあります。
送信ピン (TxD) は、何も送っていないアイドル状態の時には -12V (マーク状 態) を保持しています。バイトデータを送る際には、送信ピンはスタートビッ トを送るために +12V (スペース状態) となり、スタートビットを送る間 (期 間) は +12V を保ちます。次にバイトデータが下位ビットから順番に送られま す。もし、ビットが 0 の場合は、信号線はこのビット期間から次のビット期 間まで、+12V になります。もし、ビットが 1 の場合、信号線はこのビット期 間から次のビット期間まで、-12V になります。次のビット以降も同様に送ら れます (1 ならば -12V、0 ならば +12V)。最後のデータビットの後には、パ リティビットが送られるかもしれません。そして ストップビット -12V (マー ク) が送られます。その後は、次のスタートビットまでは送信ピンは -12V (アイドル状態) のままです。0V が返ってくることがないことと、そのため同 じ極性を持つビットが 2 つ続く場合 (0 が続く、あるいは 1 が続く場合) に は、あるビットが終って次のビットが始まることを表す簡単な方法が (同期信 号以外には) ない点に注意してください。
2 番目の境界線のストップビットも -12V になります。これは最初のストップ ビットと同じです。これらのビット間の境界を示す信号が無いため、2 番目の ストップビットの影響は、送信ピンが続けている -12V のアイドル状態の長さ が 2 倍になっただけです。2 番目のストップビットとバイト間の長いアイド ル時間の区別を付ける方法は、受信側にはありません。したがって、うまく通 信できるのは、通信の片側がストップビットを 1 つ用い、その反対側がスト ップビットを 2 つ用いた場合です。ただし、1 つしかストップビットを用い ない方が明らかに高速です。稀ですが、1 1/2 個のストップビットが使われる ことがあります。これは送信ピンが 1 1/2 区間の間 -12V を保つという意味 です (ストップビットの長さが通常の 5 割増しになったようになります)。
文字は普通、7 ビットまたは 8 ビット (のデータ) で送信されます。これに パリティビットを追加すると (追加しないこともあります) 1 バイトの長さは 7,8,9 ビットのいずれかとなります。一部の端末エミュレータや古い端末で は、 9 ビットは使えません。ストップビットを 2 つ使うと 9 ビットが使え なくなる端末もあります (というのも、スタートビットを追加した後の合計 ビット数が 12 ビットと多くなりすぎるからです)。
パリティには 「奇数 (odd)」、「偶数(even)」、「なし(none)」のいずれか を設定します (一部の端末やシリアルデバイスではマーク (mark) パリティや スペース (space) パリティがオプションとして使えます)。奇数パリティを使 うと、バイトデータ中で値が 1 になっているビットの数が (パリティビット も含めて) 奇数となるようにパリティビットが決められます。ビットがひっく り返って、このようなバイトが壊れた場合、得られるデータは不正な偶数パリ ティのデータをなります。このエラーは検出されるので、これが端末が受け取 ったバイトデータであった場合には、文字化けを表す記号を画面に表示できま す。偶数パリティの動作も同様であり、有効なバイトデータ中の 1 であるビ ット数が (パリティビットも含めて) 偶数となるようにします。設定時には通 常、文字当りのビット数はバイト当りのデータビットの数だけを意味します (正式な ASCII の場合には 7 ですし、各種 ISO 文字集合の場合には 8 です)。
``マーク'' は値が 1 であるビット (つまり論理値の 1) であり、``スペース'' は値が 0 であるビット (つまり論理値の 0) です。マークパリティの場合 には、パリティビットは常に値が 1 であるビットです。スペースパリティの 場合には、これは常に値が 0 であるビットです。マークパリティやシペース パリティは単にバンド幅を無駄にするだけなので、できる限り使わないように すべきです。 ``パリティ無し'' はパリティを付加しないという意味です。9 ビットからなるバイトデータを受け付けない端末を使う場合、8 ビット文字集 合を使うならば ``パリティ無し'' を選択しなければなりません。パリティビ ットを入れる空きが無いからです。
EIA-232 ポートを使ったバイトデータのシリアル伝送では、常に下位ビットか ら先に送られます。PC のシリアルポートは非同期通信を行います。この非同 期通信では、スタートビットとストップビットがバイトデータの始めと終りを 示します。このような区切り方はフレーム分割ト呼ばれ、フレーム分割された アバイトデータはフレームと呼ばれることがあります。結果として、1 バイト ごとに 9 個あるいは 10,11 個 のビットデータが送られます。この中で最も 一般的なのは 10 個です。8-N-1 とは、データビット 8 個、パリティ無し、 ストップビット 1 個という意味です。スタートビットを数に入れると合計 10 ビットになります。ストップビットはほぼ例外なく使われます。110 ビット/ 秒 (300 ビット / 秒の時もあります) では、ストップビットが 2 つ使われて いたこともありましたが、現在は 2 つめのストップビットが使われるのは例 外的な場合 (あるいは、その設定でもうまく動作するために間違って使われて いるけれど、バンド幅を無駄に消費している) だけです。
EIA-232 シリアルポートの規定では、本来は低速で、かつ通信距離に厳密な制 限があります。ADS は ``高速''でリードしますが、それは通信距離がかなり 短かいケースに限られていて、コンピュータの近くのモデムとの通信などの場 合によります。全ての信号線は共通の信号グランドを使用するので、ハードウ ェアを追加しなければツイステッドペア技術 (高速通信に必要) は使えません。 しかしいくつかのコンピュータにはより新しいインタフェースがあります。 EIA-232 への継承 をご覧ください。
1969 年に規定された RS-232 は、100 倍以上の速さで通信可能なツイステッ ドペア技術を使えないので少々痛ましいものであるといえます。ツイステッド ペアは 1800 年代後期より電話線で使われています。1888年 (今から 110年ほ ど前) の ``Cable Conference'' ではツイステッドペアのサポート (電話シス テム用として)と、その先進性が報告されています。しかし``Cable Conference'' での承認から 80 年以上もの間、RS-232 はこの利用を怠ったのです。RS-232 は元来、近くにある低速のモデムと端末を接続するために設計されたものなので 、高速や長距離通信の要求を明白に認めなかったのです。
ツイステッドペア (平衡型) 技術を使った高速で長距離通信のための EIA 規 格がいくつも規定されました。平衡型通信は、時に非平衡型 EIA-232 の 100 倍以上高速です。ある速度で比較すると、通信距離 (最大ケーブル長) はツイ ステッドペア線を使った場合に何倍も長くできます。PC はいまだに ``時代遅 れ'' の EIA-232 を装備していますが、低速の電話線やマウスとの接続には何 の問題もありません。
唯一の例外が Apple 社の Mac コンピュータで、送受信用にツイステッドペア (平衡型) が使える EIA-232/EIA-422 GeoPort を装備しています。小さくて 丸い `` ミニ DIN'' コネクタを使って接続します。Mac には 従来型の EIA-232 ポートもついています。5 ボルトでのみ動作しますが (これは EIA-232 ではまだ規約通りです)。しかし、このために Mac は PC よりも高価 で、ホストコンピュータの端末としても自由に使えます。いくつかの新しい端 末には EIA-423 が使われていますが、これは非平衡型 EIA-232 のようなもの で、EIA-232 ポートに接続できます。この EIA-423 は 5 ボルトでのみ動作し ますが、スペックには EIA-232 より高速だとうたっています (非平衡インタ フェースによる長時間の動作に対しては無保証です)。
EIA-485 もまた平衡型であり、ethernet や USB などのような ``バス'' とし て使えます。EIA-485 に接続された機器がマスターとして、 ``スレーブ'' か らの入力をポーリングします。多くのコンピュータがツイステッドペアを共有 するので、``マルチドロップ'' と呼ばれています。別なツイステッドペアは マスタからスレーブへのトラフィックのために使われます。ピンの出力電圧は 3 つの状態を持たなければならず、回路を開いた 3 番目の状態は他のユニッ トが ``バス'' を使うことを許可します。マルチドロップのプロトコルが標準 化されてないと言われつづけています。そして悪いニュースがあります。 http://www.hw.cz/english/docs/rs485/rs485.htmlをご覧ください。
2 Mbits/s で動作する EIA-530-A (平衡型ですが、非平衡型としても使えま す) は EIA-232 のリプレースを意図したものでしたが、一部でしか使われま せんでした。EIA-232 と同じ 25 ピンコネクタで接続します。
高速のシリアル通信インタフェース (HSSI = EIA-612/613) は 50 ピンコネク タを使い、50 Mbits/s まで向上しますが、数メータの距離に限られます。ユ ニバーサル シリアルバス (USB) は PCI チップに埋めこまれていて、4 ピン のツイステッドペアにより 12 Mbits/s で通信しますが、距離は 5 メートル 以下の制限があります (設定にもよりますが)。
テキスト端末では EIA-232 は十分高速なのですが、ケーブル長が短かすぎま す。平衡技術がこれを解決します。テキスト端末で平衡型通信を行う一般的な 方法は、平衡-非平衡変換 (逆変換も含む) を行う 2 つのラインドライバをイ ンストールすることです。それは特別な機器なので新しく購入すると高くつき ます。
EIA-232 において、送信 (あるいは受信) には 2 つの状態、マーク (-12V) とスペース (+12V) があります。0V はどの状態でもありません。したがって 1 ビットのシーケンスは、ビットとビットの間を示すマーカがない定常的な - 12V だけを使って送られます。受信側で個々のビットを区別するためには、送 信側のクロックを同期しているクロック信号が必ず必要です。このクロックが 送信 (受信) される各ビットと同期している ``時間の刻み'' を生成するので す。
非同期の伝送においては、スタートビットとストップビットを使って各バイト をフレーム分割することによって同期を実現します (これはハードウェアが行 います)。受信側は信号線からスタートビットが届くのを待ち、これを検出す るとクロックを刻み始めます。受信側はこのクロック刻みを使って、次の 7, 8,9 番目のビットを読み込むタイミングを計ります (実際にはもう少し複雑で す。というのも、普通は 1 ビットからサンプル点をいくつか取るので、その ために別のタイミング刻みが必要になるからです)。そしてストップビットを 読むと、受信側がクロックを止めて、次のスタートビットを待ちます。このよ うに、単独のバイトデータを受け取る際には、非同期伝送も実際には同期伝送 になりますが、複数のバイトデータ間での同期は行われません。
非同期 (async) とは ``同期しない'' ことです。具体的には、非同期シリア ルポートが、非同期信号をスタートビットとストップビットで囲まれたバイト の塊として送信または受信することなのです。同期 (sync) はそれ以外のほと んど全てです。でも基本コンセプトはここでは解説しません。
理論的に同期とは、バイトがクロック信号の刻みに従って一定の単位で送出さ れることです。クロック信号のために、たいていは別な線かチャネルを使いま す。非同期のバイトは、送出されるバイト間の周期が不定です (誰かがキーボ ードを叩いたときのように)。
同期か非同期かを区分けする必要のある境界的な状況があります。非同期シリ アルポートは、同期状態にさせる安定した流れの中でバイトを送出しますが、 スタート / ストップビット (不定期な送出を可能にする) が含まれているの で非同期と呼んでいます。別な場合では、データバイト (スタート / ストッ プビットのない) は不定期に送られるパケットに含まれますが、これは同期通 信と呼んでいます。各パケット内のバイトが同期して送られなければならない からです。
あなたはシリアルポートコネクタの 25 ピンの内、未使用のピンは何に使われ るのか考えたことはありますか ? ほとんどのピンは PC ではめったに実装さ れない同期通信のためにあります。同期リバースチャネルと同じように、同期 タイミング信号なのです。EIA-232 の仕様には、同期と非同期の両方がありま すが、PC が使う UART、例えば 16450, 16550A, あるいは 16650 は同期をサ ポートしていません。同期通信には USART チップか同等品が必要です。USART の ``S'' は同期 (Synchronous) の頭文字からとっています。同期通信の分 野はニッチーマーケットなので、製品はとても高価です。
EIA-232 の同期部分以外にも、EIA には同期に関する規定が各種あります。 E IA-232 の場合、コネクタの 3 番ピンはクロック (またはタイミング) 信号と して予約されています。時にはタイミング信号を生成するのはモデムの役割で あり、同期モデム (または``同期モデムエリミネータ'' と呼ぶタイミング信 号を作る機器) なしに同期通信に使うことは不可能です。
けれど少数のシリアルポートは同期通信をサポートしており、同期通信は V.42 エラー訂正機能付きのモデムを使った電話線を経由して行われます。ス タート / ストップビットを除いたデータを、電話線経由の同期操作に使用される パケットに詰め込むのです。
ブロックモードは linux では稀にしか使われません。ブロックモードでは、 端末でキーが叩かれたときにキーコードは端末内のメモリに保存され、すぐに はホストコンピュータに送られません。そのような端末にはよく組込みの編集 機能が備わっています。ユーザがあるキー (送信キーなどのような) を押した とき、端末内のメモリに保存されていたものがホストコンピュータに送られま す。今日 Linux のエディターである vi や emacs ではあるキーが押されたら すぐに反応します。従って上記のシチュエーションで、送信キーがが押されて も何も起こらず、何も送られません。このような理由で、ブロックモート端末 を使うときには対話式のプログラムの使用を許していません。 IBM の古いメ インフレームではインタフェースにブロックモードが使われるので ( IBM 端末をご覧ください)、多くの IBM 端末はブロックモー ドだけをサポートし、また同期通信を行います ( 同調させることと同期の章をご覧ください)。
ブロックモード自身には ``ページ'' (一度に 1 ページ) や ``ライン'' (一 度に 1 行) などのサブモードがあります。いくつかの端末にはブロックモー ドと従来のキャラクターモードの両方があり、あるモードから別なモードへ切 り替えることができます。ブロックモードを持つ非同期端末として HP2622A, VT130, VT131, VT330, VT340 それに Visual500 があります。後のモデルの 多くはブロックモードをエミュレートできます。ブロックモードは、ホストコ ンピュータが端末に送るフォーム機能に対応します。ユーザがデータを入力し た後に送信キーを押せば、入力したデータだけがホストコンピュータに送られ ます。フォーム自身 (データではない) はホストに送信されない保護されたフ ィールドとして画面に表示されます。
ブロックモードはホストコンピュータの負荷を相当量減らします。特にホスト コンピュータのハードウェアがブロックモード対応として設計されている (IBM のメインフレームのように) なら尚更です。キャラクタモードではキータイ プされた全ての文字はすぐにシリアルポートに送られ、ホストコンピュータに 割込みを発生させます。バイトを受信したホストは何をしていようが中断して、 シリアルポートから文字を取り出さなければなりません。FIFO ハードウェア バッファがある UART であっても、ハードウェアのタイムアウトは 3 バイト の送信時間分しかないので、各文字がタイプされたら即座に割り込みが発生し ます。
本当のブロックモードでは、1 回の割り込みで長い文字ブロックを受信します。 ブロックモードが従来の非同期 FIFO シリアルポートで使われたら、14 バイ ト毎に割込みが必要なので、16 バイトのハードウェアバッファがあります。 このように多くの負荷や割り込みハンドラのオーバヘッドを軽減するので、コ ンピュータはブロックモードを使っているときは他の仕事に時間を割くことが できるのです。
端末がネットワーク経由でつながっているなら、ブロックモードにすると貴重 な節約ができます。ブロックモードでなければ、タイプされた全ての文字 (バ イト) は、余分なバイト (インターネットで使われる TCP/IP のパケットでは 40 バイト) を含んだパケットに包まれて送られることになります。ブロック モードでなら大量の文字は 1 つのパケットで送られます。
(注 : 最初の本は EIA-232 より広範な分野をカバーしています)
シリアルポートについての Linux 用のソウトウェアについては Serial Softwareをご覧ください。getty やポートモニタなどが含ま れています。