次のページ 前のページ 目次へ

17. 電圧の波形

17.1 ビット 1 つを表す電圧

EIA-232 準拠のシリアルポートでは、電圧は二極式(接地電圧に対して正ま たは負)であり、その大きさは約 12 V です(5 または 10 V のものもあ ります)。送信ピンと受信ピンでは +12 V が 0 を表すビット(「space」 と呼ばれることもあります)で、-12 V が 1 を表すビットです(「mark」 と呼ばれることもあります)。これは反転論理として知られています。という のも、普通は 0 を表すビットは偽かつ負であり、1 は真と正を表すからです。 送信ピンと受信ピンは反転論理ですが、他のピン(モデム制御線) は通常の論理を用いており、正の電圧が真(または「オン」)であり、負の電圧 が偽(または「オフ」)を表します。電圧 0 は意味を持ちません(その機器の電 源が切れているという意味だけは持ちます)。

電圧に範囲を持たせることもできます。仕様においては、送信される信号の強 さは 5 V と 15 V の間でなければならず、25 V を超えてはなり ません。3 V 未満の電圧は未定義です(ただしデバイスによっては電圧が 低くても有効であるとして受け付けます)。 電圧はたいてい 11-12 V なのですが、「一般的に 5 V (あるいは 3 V) である」とする誤りをときどき見かけます。 ただし Macintosh の EIA-422 ポートを EIA-232 (特殊なケーブルが必要)や EIA-423 としてお使いならば、電圧はまさしくわずか 5 V のはずです。 ここでの説明では 12 V を使うものとします。

通常のコンピュータの論理回路は数 V (かつては 5 V が標準だったこ ともありますが)しか使わないので、3-5 V のコンピュータ回路(TTL)の試 験用に設計されたテスト機器を 12 V のシリアルポートに対して用いると、 テスト機器が壊れてしまうことがあります。

17.2 バイトデータを表す電圧シーケンス

送信ピン(TxD)は、何も送っていないアイドル状態の時には -12 V (mark 状態)を保持しています。バイトデータを送る際には、送信ピンはスタートビッ トを送るために +12 V (space 状態)となり、スタートビットを送る間(区間) は +12 V を保ちます。次にバイトデータの下位ビットが送られます。0 を表 すビットの場合は、何も変化せず、このバイト区間の間は送信ピンは +12 V のままです。1 を表すビットの場合は、電圧は +12 V から -12 V に変わりま す。次のビット以降も同様に送られます(1 ならば -12 V, 0 ならば +12 V)。 最後のデータビットの後にはパリティビットや、その後の -12 V (mark 状態) のストップビットが送られることもあります。その後は、次のスタートビット までは送信ピンは -12 V(アイドル状態)のままです。 0 V が返ってくることがないことと、そのため同じ極性を持つビットが 2 つ続く場合(0 が続く、あるいは 1 が続く場合)には、あるビットが終わっ て次のビットが始まることを表す簡単な方法が(同期信号以外には)ない点に注 意してください。

2 番目のストップビットも -12 V になります。これは最初のストップビット と同じです。これらのビット間の境界を示す信号が無いため、2 番目の ストップビットの影響は、送信ピンが続けている -12 V のアイドル状態の長 さが 2 倍になる以外にはありません。2 番目のストップビットとバイト間の 長いアイドル時間の区別を付ける方法は、受信側にはありません。 したがって、うまく通信できるのは、通信の片側がストップビットを 1 つ用 い、その反対側がストップビットを 2 つ用いた場合です。ただし、1 つしか ストップビットを用いない方が明らかに高速です。稀ですが、1 1/2 個の ストップビットが使われることがあります。これは送信ピンが 1 1/2 区間の 間 -12 V を保つという意味です(ストップビットの長さが通常の 5 割増しに なったようになります)。

17.3 パリティ検査

文字は普通、7 ビットまたは 8 ビットのデータで送信されます。これに パリティビットを追加すると(追加しないこともあります) 1 バイトの長さは 7, 8, 9 ビットのいずれかとなります。一部の端末エミュレータや古い端末で は、9 ビットは使えません。ストップビットを 2 つ使うと 9 ビットが使えな くなる端末もあります(というのも、スタートビットを追加した後の合計のビッ ト数が 12 ビットと多くなりすぎるからです)。

パリティには「奇数(odd)」、「偶数(even)」、「なし(none)」のいずれかを 設定します(一部の端末やシリアルデバイスでは、mark パリティや space パリティがオプション として使えます)。奇数パリティを使うと、バイトデータ中で値が 1 になって いるビットの数が(パリティビットも含めて)奇数となるようにパリティビット が決められます。ビットがひっくり返って、このようなバイトデータが壊れた 場合、得られるデータは不正な偶数パリティのデータとなります。このエラー は検出されるので、これが端末が受け取ったバイトデータであった場合には、 文字化けを表す記号を画面に表示できます。偶数パリティの動作も同様であり、 有効なバイトデータ中の 1 であるビット数が(パリティビットも含めて)偶数 となるようにします。設定時には通常、文字当たりのビット数はバイト当たり のデータビットの数だけを意味します(正式な ASCII の場合には 7 ですし、 各種 ISO 文字集合の場合には 8 です)。

"mark" は値が 1 であるビット(つまり論理値の 1)であり、"space" は値が 0 であるビット(つまり論理値の 0)です。mark パリティの場合には、パリティ ビットは常に値が 1 であるビットです。space パリティの場合には、これは 常に値が 0 であるビットです。mark パリティや space パリティ (「sticky パリティ」とも呼ばれます) は単にバンド幅を無駄にするだけなので、できる限り使わないようにすべきです。 stty コマンドは sticky パリティを設定できませんが、 シリアルポートのハードウェアはこのパリティに対応しており、C 言語の プログラムで扱うことができます。 「パリティ無し」は、パリティビットを追加しないという意味です。9 ビットからな るバイトデータを受け付けない端末を使う場合、8 ビット文字集合を使うなら ば「パリティ無し」を選択しなければなりません。これはパリティビットを入 れる空きが無いからです。

17.4 バイトデータの構成 (フレーム分割)

EIA-232 ポートを使ったバイトデータのシリアル伝送では、常に低位のビットか ら先に送られます。PC のシリアルポートは非同期通信を行います。この非同 期通信では、スタートビットとストップビットがバイトデータの始めと終わりを示 します。このような区切り方はフレーム分割と呼ばれ、フレーム分割されたバ イトデータはフレームと呼ばれることがあります。結果として、1 バイトごと に 9 個 あるいは 10, 11 個のビットデータが送られます。この中で最も一般 的なのは 10 個です。8-N-1 とは、データビット 8 個、パリティ無し、ストップ ビット 1 個という意味です。スタートビットを数に入れると合計 10 ビットに なります。ストップビット 1 つはほぼ例外なく使われます。 110 ビット/秒(300 ビット/秒の時もあります)では、ストップビットが 2 つ使わ れていたこともありましたが、現在は 2 つめのストップビットが使われるのは ごく例外の時(あるいは、その設定でもうまく動作するために間違って使われ ているけれど、バンド幅を無駄に消費している)だけです。

17.5 「非同期」通信で同期を行う方法

PC が装備している EIA-232 のシリアルポートは非同期です。 つまり実際には、それぞれのビットを送る時に「時間を刻む」ための「クロッ ク」信号が送られないということです。送信(受信)用の線には 2 つしか状態 がありません。すなわち mark 状態(-12 V) と space 状態(+12 V)です。0 V の状態はありません。したがって 1 ビットのシーケンスは、ビットとビット の間を示すマーカーが無い定常的な -12 V だけを使って送られます。受信側 で個々のビットを区別するためには、送信側のクロックと同期しているクロッ ク信号が必ず必要です。このようなクロックは送信(受信)される各ビットと同 期している「時間の刻み」を生成します。

非同期の伝送においては、スタートビットとストップビットを使って各バイトを フレーム分割することによって同期を実現します(これはハードウェアが行い ます)。受信側は負の電圧の配線上で正のスタートビットを待ち、このビットを検 出するとクロックを刻み始めます。受信側はこのクロック刻みを使って、次の 7, 8, 9 個のビットを読み込む時間を計ります(実際にはこれよりももう少し 複雑です。というのも、普通は 1 ビットからサンプル点をいくつか取るので、 そのために別のタイミング刻みが必要になるからです)。そしてストップビット が読み込まれると、受信側はクロックを止めて、次のスタートビットを待ちま す。このように、単独のバイトデータを受け取る際には非同期伝送も実際には 同期伝送になりますが、複数のバイトデータの間での同期は行われません。


次のページ 前のページ 目次へ