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

4. モデムとシリアルポートの基礎

モデムを使用するあるいは取り付けるために、その基礎を必ずしも理解す る必要はありません。しかし、何か問題が起こった際にモデムの動作原理を理 解していれば、何が悪いのかを見定めるのに役立つかもしれません。本章を読 んだあと、更に理解を深めたいのなら、(まだ不完全ですが)本文書中の モデムがどのように動作するのか の章を読み たくなるでしょう。シリアルポートに関する(本章の内容以上の)詳細について は、Serial-HOWTO に記述があります。

[ 訳注 : JF プロジェクトによる日本語訳 Serial-HOWTO ]

4.1 モデムのデジタル-アナログ変換(およびその逆)

既に電話網の基幹部はほぼすべてデジタル回線になってるものの、家庭 (あるいはオフィス)への回線はたいていアナログ回線です。つまり、発声した 音声波形の正確な複製を電圧波形として送るように設計してあります。このよ うな電圧波形を「アナログ」と呼びます。オシロスコープで観測すると、アナ ログ波形は周波数と振幅が変化する正弦波のように見えます。デジタル信号は 方形波に似ています。例えば、3 ボルトは 1 に、0 ボルトは 0 に割り当てま す。(外付けモデムが使用する)大抵のシリアルポートは +12 ボルトが 0 を、- 12 ボルトが 1 を表します(いくつかは ±5 ボルトのものもあります)。

電話回線を通してコンピュータからデータを送るために、モデムはコンピュー タからのデジタル信号をアナログ信号に変換します。モデムはアナログ正弦波 を生成し、それを変調 (MODulating) します。変調の結果はデジタルデータを 表現しているので、この信号もまたアナログ信号ではなくデジタル信号と呼び ます。しかし、その信号はアナログ信号と類似しており、ほぼすべての人がア ナログ信号と呼んでいます。電話回線のもう一方の端で、他のモデムがこの信 号を復調し (DEModulate)、もとのデジタル信号を復元します。この変調 (MODulating) と復調 (DEModulate) をまとめて(2つの d のうちひとつを落と して)、モデム (modem) という語になります。従って、モデム (modem) とは 変調 - 復調器 (MODulator - DEModulator) を意味します。変調に関しては 変調の詳細 の節に記述があります。

4.2 シリアルポートとは?

シリアルの基礎

シリアルポートは入出力装置です。

モデムにはコンピュータとの間にシリアルポートがあり、モデムと同様にシリ アルポートについても理解する必要があります。

ほとんどの PC はシリアルポートを 1 つあるいは 2 つ持っています。各ポー トはコンピュータの裏側に 9 ピン (25 ピンのこともあります)コネクタを持っ ています。コンピュータのプログラムは送信ピン(出力)にデータ(バイト列)を 送ることができますし、受信ピン(入力)からデータを受け取ることもできます。 他のピンはフロー制御と接地のために使います。

シリアルポートは単なるコネクタではありません。シリアルポートは並列のデー タを直列に変換し、データの電気的な表現を変えます。コンピュータ内部では、 データを表すビット群は並列に流れます(同時に複数の配線を用います)。デー タを直列に流すことは、1 本の配線(シリアルコネクタの送信ピンや受信ピン等) にビットのストリームを流すことです。シリアルポートでこのようにデータを 流すため、シリアルポートはデータを並列(コンピュータ内部の形式)から直列 に変換できなければなりません(その逆の変換も必要です)。

シリアルポートの電子回路のほとんどは、UART と呼ばれるチップ(あるいはチッ プの一部)です。UART の詳細については、 UART って 何ですか? 性能にどんな影響を与えますか? の章を見てください。しかし、 まずはこの章から読むとよいでしょう。全体における UART の位置づけが分か るからです。

ピンと配線

古い PC では 25 ピンのコネクタが使われていましたが、このうち実際に 使われていたのは 9 本のピンだけです。従って、現在ではほとんどのコネク タは 9 ピンです。9 本のピンはそれぞれ配線につながっています。データの 送信と受信用に 1 本ずつの配線が使われ、信号の接地用に 1 本のピン(配線) が使われます。各配線の電圧は、この接地電圧に対して計測されます。従って、 双方向のデータ送信に必要となる最小の配線数は3本です。接地線を用いなく とも動作しますが、この場合には性能が落ちたり、エラーが起きたりします。

他にも配線がありますが、これらは制御用(シグナリング)に使われるだけであ り、データの送信には使われません。全種類の信号を同じ線で共有することも できますが、シリアルポートはそうなっておらず、信号の種類ごとに別々の専 用線が用意されています。これらの制御用配線の一部(あるいは全部)は 「モデム制御線 (modem control line)」と呼ばれます。モデム制御線の状態は、 +12 ボルトの有効 (on) 状態か、-12 ボルトの無効 (off) 状態のどちらかです。 これらのモデム制御線の 1 つは、コンピュータにシリアルポートからのデー タ送信を止めさせる信号を送るためのものです。この反対に、シリアルポート に接続されたデバイスからコンピュータへのデータ送信を止めさせるための制 御線もあります。この他にも、接続されているデバイスがモデムの場合にモデ ムに電話を取るように指示したり、接続が確立していることや電話が鳴ってい る(誰かが電話をかけてきている)状態であることをコンピュータに教えるため の線もあります。ピンおよび制御信号の詳細については、Serial-HOWTO を ご覧ください。

[ 訳注 : JF プロジェクトによる日本語訳 Serial-HOWTO ]

内蔵モデムのシリアルポート

内蔵モデムには9ピンのコネクタはありませんが、ちょうど前述の配線が 存在するかのように振る舞います。モデム制御線の12ボルト信号ではなく、内 蔵モデムには存在しない「配線」の状態を表すため、自分自身にメモリ(レジ スタ) を持ち、その状態ビットを使用します。コンピュータには、内蔵モデム のシリアルポートが本物のシリアルポートのように見えます。そして、通常の シリアルポートと同様に、115200 bits/sec といった回線速度制限もあります。 現在では不幸なことに、多くの内蔵モデムが上記のような方法では動作せず、 (CPU で動く)ソフトウェアがモデムの処理の大部分を行います。ときには、こ ういったソフトウェアは MS Windows 用のものしかありません(Linux へ移植 されていません)。こういったモデムの多くは Linux で動作しません。 (内蔵)ソフトウェアモデムの節をご覧ください。

4.3 IO アドレスおよび IRQ

コンピュータはそれぞれのシリアルデバイスと通信する必要があるので、 OS はそれぞれのシリアルポートが存在することと、それらがある場所 (I/O アドレス)を知っていなければなりません。 また、OS はシリアルポートが CPU にサービスを要求するときにどの線(IRQ 番号)を使うかも知っている必要 があります。シリアルポートはこの線に割込みを送ることによってサービスを 要求します。したがって、それぞれのシリアルポートデバイスは I/O アドレ スと IRQ (Interrupt ReQuest number)の両方を不揮発性メモリに保存してい なければなりません。 割込み の節をご覧くだ さい。PCI バスの場合は、全くこのように動作するわけではありません。とい うのも、PCI には独自の割込みシステムがあるからです。しかし、PCI 対応の BIOS はチップの設定を行って PCI の割込みを IRQ にマッピングするため、 見かけ上は先の説明の通りに動作します。ただし、割込みの共有が許されてい る点は除きます(2 つあるいはそれ以上のデバイスが同じ IRQ 番号を使うこと ができます)。

I/O アドレスはメモリのアドレスとは異なります。I/O アドレスがコンピュー タのアドレスバスに設定されると、他の配線に信号が流れます。この信号は、 メインメモリにアドレスを無視させることと、I/O アドレスを持っている全て のデバイス(シリアルポート等)にそのアドレスを監視させ、それがデバイスの アドレスにマッチするかどうかを調べさせることを指示します。もしアドレス がマッチすれば、その I/O デバイスはデータバス上のデータを読み込みます。

4.4 名前: ttyS0, ttyS1 など

シリアルポートには ttyS0, ttyS1 といった名前が付けられま す(そしてこれは普通 DOS や Windows における COM1, COM2 等に対応します)。 /dev ディレクトリには、それぞれのポートに関するスペシャルファ イルがあります。 ``ls /dev/ttyS*'' を実行してこれらのファイル を見てみましょう。ただし、 (例えば)ttyS3 ファイルがあるからといっ て、必ずしもそこに物理的なシリアルポートが存在するわけではありません。

(ttyS0, ttyS1 等の)名前がどの物理シリアルポートを指すのかは、 以下のようにして決まります。シリアルドライバ(ソフトウェア)は、どの I/O アドレスがどの ttyS に対応するのかを示す表を管理しています。この ような名前(ttyS1 等)から I/O アドレス(と IRQ)への対応は、設定も表 示も ``setserial'' コマンドで行うことができます。 setserial とは何か?の節をご覧ください。このプログラムはハード ウェアそのものの I/O アドレスや IRQ の設定は行いません (ハードウェ アの設定はジャンパやプラグ&プレイの設定プログラムで行います)。この ように、どの物理ポートが ttyS1 などに対応するのかは、シリアルドラ イバの設定 (setserial による)とハードウェアの設定の両方に依存します。 これに間違いがあると、物理ポートは (ttyS2 などの)どの名前にも対応 せず、従って使えないかもしれません。詳しくは /dev/ttyS2 などのシリアルポートデバイス の章をご覧ください。

4.5 割込み

電話回線を通じモデムにやってくるデータは、モデムがアナログからデジ タルへ変換します。そして、シリアルポートを通りコンピュータ中の目的地に 到着します。

シリアルポートは、ある数のバイトデータ(1, 4, 8, 14 のいずれかに設定さ れていると思います)のデータを FIFO バッファに受け取ります。すると、通 常はそのポートだけが使う特定の配線上に割込みとして知られる電気信号を流 すことにより、そのデータを取り込むように CPU に伝えます。このように FIFO は、ある数のバイトデータを待って、それから割込みを発行します。

しかし、この割込みは、次のバイトデータが届くのを待っている間に、予期し ない遅延が生じたときにも送られます(タイムアウトといいます)。このように、 (端末のキーボードで入力しているときのように)バイトデータがゆっくり受信 されていると、1 バイトを受け取るごとに割込みが発行されるかもしれません。 一部の UART チップでは、以下のような規則になります: 4 バイトを連続して 受け取れるかもしれなかったのに、これらの 4 バイトのデータがいずれも出 てこなければ、シリアルポートは次のバイトデータを待つのをあきらめ、現在 FIFO に入っているバイトデータを取得させるために割込みを発行します。も ちろん、FIFO が空であれば割込みは発行されません。

それぞれの(コンピュータ内部の)割込み線には番号 (IRQ) が付いており、シ リアルポートは信号を送るためにどの線を使うのかを知らなければなりません。 例えば、ttyS0 は通常、IRQ 番号 4 を使います。これは IRQ4 (または IRQ 4) と書きます。IRQ 番号のリストなどは ``man setserial'' に書 いてあります( 「シリアルポートのコンフィギュレーション上の注意事項 (Configuring Serial Ports)」の章を見てください)。シリアルポートが CPU の注意を引きつける必要がある際には、必ず割込みを発行します。割込みの発 行を適切なタイミングで行うことは重要です。というのも、シリアルポートの バッファは入ってくるデータを 16 バイト(古いシリアルポートでは 1 バイト) しか保持できないからです。このような受信データをバッファからうまく取り 出すことに CPU が失敗すると、これ以上のデータが入る場所がなくなり、小 さなバッファがあふれて(オーバーラン)が起こってしまい、データは無くなり ます。

外付けモデムに関しては、この現象をすみやかに防ぎオーバーフローを止める (フロー制御のような)方法はありません。内蔵モデムに関しては、16バイトの FIFO バッファがモデムボード上にあり、出来の良いモデムはバッファに空き がなければ書込みを行いません。従って、良い内蔵モデムはこの16バイトのバッ ファをあふれさせることがありません。しかし、モデム自体がオーバーフロー することを防ぐには モデム間のフロー制御 を 使う必要があるかもしれません。以上のことは外付けモデムに対する、内蔵モ デムのひとつの利点になっています。

割込みは、シリアルポートが 16 バイトのデータを小さい送信バッファから外 部ケーブルに全て送り出した直後にも発行されます。この送信バッファには、 送り出すデータ用の 16 バイトの空きができます。割込みはこの事実を CPU に伝え、小さい送信バッファに送信すべき新しいデータを入れさせるために用 います。また、モデム制御ラインの状態が変化したときにも割込みが発行され ます。

前述のバッファはすべてハードウェアバッファのことです。シリアルポートは 主記憶上にも大きなバッファを持っています。これに関しては後ほど説明しま す。

割込みは多くの情報を伝えますが、これは間接的にしか行いません。割込みそ のものは、特定のポートが注意を求めていることを割込みコントローラと呼ば れるチップに知らせるだけです。割込みコントローラはこれを受けて CPU に 信号を送ります。CPU はシリアルポートにサービスを提供する特殊なプログラ ム(シリアルデバイスドライバの一部)を実行します。このプログラムは割込み サービスルーチン(または割込みハンドラ)と呼ばれます。割込みサービスルー チンはシリアルポートで起きた出来事を調べ、その問題 (シリアルポートのハー ドウェアバッファのデータ入出力など)を処理します。このルーチンはシリア ルポートで起きたことを簡単に知ることができます。というのも、シリアルポー トのレジスタはシリアルデバイスドライバが知っている I/O アドレスにある からです。このレジスタは、シリアルポートの状態に関する情報を保持してい ます。デバイスドライバはこのレジスタを読んでその内容を調べることにより、 シリアルポートで起きたことを知り、適切な動作を行うことができます。

4.6 (モデムによる)データ圧縮

シリアルポートの基礎を続ける前に、モデムが行っているデータ圧縮に関 して理解する必要があります。コンピュータの CPU がソフトウェア処理によ りこの圧縮を行うこともあります。しかし不幸なことに、現在ではこういった ソフトウェアは MS Windows 上でしか動作しません。これは Linux でモデム を動作させるために必ず発生する問題であり、この議論はモデム自身がどこで 圧縮を行うのかに関するものです。

電話回線を通じデータをより高速に送るためには、ひとつにはデータに依存し た特定の符号化方式を用いて圧縮を行う方法があるでしょう。符号化したデー タはもとのデータよりも小さくなり、短い時間でインターネットを通じて送る ことができます。この過程を「データ圧縮」と呼びます。

インターネットからファイルをダウンロードする際、ファイルは既に圧縮して あり、モデムが更に圧縮を試みてもうまくいきません。モデムは既に圧縮済み のものを感知し、更なる圧縮を試みないかもしれません。対向するモデムから 圧縮済みのデータを受け取ったたら、モデムはデータを展開し、電話回線を通 じ送られたデータより多くのデータを作成します。従って、モデムからコン ピュータへ送られるデータ量は、電話回線上での流量よりも多くなるでしょう。 これらの流量の比率を圧縮率と呼びます。圧縮率は最高でも 4 程度ですが、 ほとんどありえないことです。

4.7 エラー訂正

モデムがエラー訂正を行うように設定されているかもしれません。これは データ圧縮に似ています。エラー訂正には送信速度(フローレート)を減少させ るオーバーヘッドが伴うものの、エラー訂正はスタートビットおよびストップ ビットを削ぎ落し、送信速度を向上させます。

外界とのインターフェイスであるシリアルポートは、各 8 ビット(1バイト)に スタートビットおよびストップビットの 2 ビット分を付加します。エラー訂 正がなければ、これらの付加されたスタートビットおよびストップビットは、 モデムと電話回線を通過していきます。しかし、エラー訂正を有効にすると、 こういった付加ビットは取り除かれ、8 ビット分がパケットに入ります。パケッ トヘッダおよびエラー訂正用の付加情報があるにも関わらず、これは効率が良 くより高い送信速度をもたらします。

4.8 データフロー(速度)

(文字、画像などを表すバイト列である)データはコンピュータからモデム へと流れ、電話回線を通じ外界へ、あるいはその逆方向に送られます。データ が流れる速度である (56k (56000) ビット/秒などの)フローレートは、(不正 確ですが) 「速度」と呼ばれます。ですが大抵の人は「フローレート」ではな く「速度」の方を使います。もしデータ圧縮を行わなければ、コンピュータか らモデムへのフローレートは電話回線上での伝送速度と等しいはずです。

実際、電話回線の終端にはふたつの異なったスピードがあります。

電話回線のもう一端にあるモデムに電話をかけて接続すると、モデムは ``CONNECT 28800'' あるいは ``CONNECT 115200'' といったメッセー ジをあなたに送ります。これは何を意味しているのでしょうか? これは DCE スピードあるいは DTE スピードを示します。表示されたスピードがモデムの スピードより高速なら、それはモデムとコンピュータ間の DTE 速度のはずで す。115200 を示した上記の場合がそれにあたります。28800 に関しては、シ リアルポートにはその速度がないので、DCE (モデム - モデム間)速度のはず です。どちらか一方の速度を示すよう、モデムを設定する人がいるかもしれま せん。また、両方の速度、そして(例えば) ``CARRIER 28800'' のような モデム間の速度を示すモデムもあるでしょう。

内蔵モデムの場合には、モデムがコンピュータの内部にあってほとんどコン ピュータの部品なので、モデムからコンピュータへの DTE 速度には速度上の 限界はないでしょう。しかし、内蔵モデムは内部に専用のシリアルポートがあ ります。

平均速度は仕様で決められている速度よりも遅い場合が多いことを理解してお くことが大切です。待ち時間(あるいはアイドル時間)があると、平均速度は低 くなります。このような待ち時間には、 フロー 制御 による 1 秒程度もある長い待ち時間も含まれます。別の極端な例とし ては、バイトデータを送る間の数ミリ秒という非常に短い待ち時間があります。 それに加え、電話回線の状態が良くない場合、モデムは速度を落とすこともあ ります。

最良の DTE 速度に関する議論は 使うべき速度は? の章をご覧ください。

4.9 フロー制御

フロー制御とは、配線を流れるバイトデータを止める機能のことです。こ れには、バイトデータを失うことなくデータを再び流し始める機能も含まれま す。フロー制御は、モデムが瞬間のフローレートを非連続的に変えられるよう にするために必要です。

フロー制御の例

例として、33.6k の外部モデムを短いケーブルを使ってシリアルポートに 接続する場合を考えましょう。このモデムは電話回線上で 33.6k bps (ビット 毎秒)でデータを送受信します。データ圧縮やエラー訂正は全く行わないもの とします。シリアルポートの速度は 115.2k bps に設定してあり、データをコ ンピュータから電話回線に送ります。すると、コンピュータからモデムへは短 いケーブルを通って 115.2k bps でデータが流れます。しかし、モデムから電 話回線へは 33.6k bps でしかデータが流れません。データが出て行くよりも 速くデータが入ってくるので、モデムは超過分のデータ (115.2k -33.6k = 81.6k bps)をバッファに保持しなければなりません。 115.2k bps のデータの 流れが止まらない限り、結局はこのバッファは溢れて (空き容量がなくなって) しまいます。

ですが、ここでフロー制御が役立ちます。モデムのバッファが溢れそうになる と、モデムはシリアルポートに停止信号を送ります。シリアルポートはこの停 止信号をデバイスドライバに渡し、115.2k bps のデータの流れは停止します。 モデムは、今までバッファに蓄えたデータを取り出しながら、そのまま 33.6k bps でデータを送り続けます。するとバッファには何も入ってこないため、バッ ファ内のデータ量は減り始めます。バッファ内のデータがほとんどなくなると、 モデムは開始信号をシリアルポートに送り、コンピュータからモデムへ再び 115.2k bps でデータが流れ始めます。フロー制御により事実上、短いケーブ ル上での平均的なフロー速度(この場合は 33.6k bps)は、データを「流し続け た」場合の速度である 115.2k bps よりもずっと遅くなります。これが「開始- 停止」フロー制御です。

上記の簡単な例はコンピュータからモデムへの流れのフロー制御でしたが、反 対向きの流れ(モデムからコンピュータへの向き)に対して用いるフロー制御も あります。すなわちモデム(または他のデバイス)からコンピュータの向きです。 どちらの向きの流れにも 3 つのバッファ(1. モデム内のバッファ、 2. UART チップ(いわゆる FIFO)の内部、3. シリアルドライバが管理するメインメモリ 中のバッファ)があります。フロー制御は、特定のバッファが溢れないように 保護します。小さい UART FIFO バッファはこのような保護を受けていません が、その代わりに、このバッファが発行する割込みへの応答が高速であるこ とを期待して動作します。FIFO は「First In, First Out(先に入ったデータ が先に出る)」という、バイトデータの扱い方を表しています。 3 つのバッファ 全てが FIFO の規則で動作しますが、これを名前として持っているのは 1 つ だけです。これがフロー制御の本質ですが、説明することはもっとたくさんあ ります。

この(モデムから PC への)方向のフロー制御は必要ないことが多いです。これ が必要となる複雑な例に関しては Serial-HOWTO の ``複雑なフロー制御の例'' をご覧ください。しかし、モデムとコンピュータ間(シリアルポート)に充分に 高速な設定がない場合、モデムから PC への流れを減らす必要があります。そ のためには、電話回線からのデータの流入を停止しなければなりません。モデ ムは対向するモデムに送信を停止するよう伝えなければいけません。 モデム間のフロー制御 をご覧ください。

[ 訳注 : JF プロジェクトによる日本語訳 Serial-HOWTO ]

ハードウェアフロー制御対ソフトウェアフロー制御

可能であれば、できるだけ「ハードウェア」のフロー制御を使いましょう。 これは専用の「モデム制御線」を 2 本使い、「停止(stop)」と「開始(start)」 の信号を送るものです。

最近のモデムはシリアルポートとの間で、ハードウェアフロー制御をほぼ常時 用います。

ソフトウェアフロー制御は、制御信号を送るために ASCII 制御文字の DC1(開 始)と DC3(停止)を使います。この制御文字は単に、通常のデータストリーム 内に挿入されます。ソフトウェアのフロー制御は反応が遅いだけでなく、特別 な対策を講じなければモデムを使ってバイナリデータを送ることもできません。 バイナリデータには大抵、フロー制御用の制御文字 DC1, DC3 が入っています。 従って、特殊な対策を立てて、フロー制御の停止信号である DC3 とバイナリ コードの一部である DC3 を区別しなければなりません。DC1 についても同様 です。

バイナリデータに対してソフトウェアフロー制御を行うためには、モデム(ハー ドウェア)とソフトウェアの両方での対応が必要です。

フロー制御がないときの症状

フロー制御の理屈が分かっていると、実際に役立つこともあります。例え ば、著者はモデムを使ってインターネットにアクセスし、問題なく稼動してい るかに見えました。しかし、数ヶ月後に PC から ISP へ大きなファイルを送 ろうとした際、大量の再送および送信誤りが生じました。(結局 Kermit は多 くの再送をしたののち、ファイルを送ることができました。) (ISP から著者 への)逆方向の受信では快適に動いていました。この問題はモデムのフロー制 御が無効になるハードウェアの欠陥によるものでした。著者のモデムはデータ 送信を止めるための「停止」信号をコンピュータに送らなかったので、大きな 送信ファイルでバッファがオーバーフロー(オーバーラン)しました。モデムか らコンピュータへの方向では、電話回線上の流量よりも( 115.2k という)モデ ムからコンピュータへの容量のほうが常に大きいため、問題が発生しませんで した。初期化文字列にフロー制御を有効にするコマンドを付加しフロー制御を 有効にすることで、この問題を解決しました(デフォルトで有効になっている はずなのに、何かがおかしくてそうなっていませんでした)。

モデム間のフロー制御

これは電話回線を通じ 2 つのモデム間でデータを送る際の、フロー制御 に関する記述です。エラー訂正が有効な場合のみ、モデム間のフロー制御は可 能となります。実際、エラー訂正を行わなければ、モデム間のソフトウェアフ ロー制御を有効にできますが、バイナリデータの送信を妨げるかもしれないの で、あまり用いません。

4.10 データフロー経路 - バッファ

この話題については、フロー制御、(ハードウェアが持つ) 16 バイトの FIFO バッファの対、モデムにある大きなバッファ対を含めた大部分を既に説 明しました。しかし、これ以外にもまだバッファの対があります。メインメモ リ上にある大きな(多分 8kB の)バッファがあり、これもシリアルポートのバッ ファと呼ばれます。アプリケーションプログラムがデータをシリアルポート (そしてモデム)に送ると、このデータはまずメインメモリ上の方の(シリアル ポートの) 送信バッファに格納されます。バッファの対はデータの流れの向き が反対である、送信バッファと受信バッファの組み合せです。

シリアルポートのデバイスドライバは、例えば 16 バイトのデータを 1 バイ トずつ送信バッファから取り出し、これをシリアルポートのハードウェアが送 信用に持っている送信バッファに入れます。一度データが送信バッファに入る と、その送信を止める方法はありません。そしてこのデータはシリアルポート から適切な大きさ(恐らく 1KB )のバッファを持つモデムへ送り出されます。 デバイスドライバが(フロー制御の指示を受けて)コンピュータから送信される データの流れを止めたとき、実際に止まるのはメインメモリ上の大きな送信 バッファから送り出されるデータの流れです。データが止められ、モデムへ送 り出されるデータの流れが止まった後であっても、アプリケーションプログラ ムは、8kB の送信バッファがいっぱいになるまでは、ここにデータを送り続け ることができます。

このバッファがいっぱいになると、アプリケーションプログラムはそれ以上の データを送る(C 言語では ``write'' 文を使います) ことができなくなり、ア プリケーションの実行を一時的に停止してバッファに空きができるのを待ちま す。このように、フロー制御の ``stop'' 信号は結局、データを送るプログラ ムを止めることができます。このプログラムが止まっても、コンピュータは計 算を止める必要はありません。フロー制御の stop 信号を受けて待っている間 は、別のプロセスに切替えればよいのです。以上の説明は多少簡略化しすぎて いますが、``write'' 文を待っている間にアプリケーションプログラム自体に 別処理をさせる方法がこれとは別にあるからです。

4.11 モデムコマンド

通信ソフトウェアはデータを送る配線と同じ配線を用いて、モデムへコマ ンドを送ります。このコマンドは短い ASCII 文字列です。例えば、 ``AT&K3'' はコンピュータとモデム間のハードウェアフロー制御 (RTS/CTS) を有効にします。``ATDT5393401'' は電話番号 5393401 をダ イヤルします。すべてのコマンドが ``AT'' で始まることに注意してく ださい。こういったコマンドはフロー制御を有効にするなど、モデムを設定す るために役立ちます。その他のコマンドは電話番号をダイヤルするなど、何ら かの動作を行います。約 100 以上の異なった使用可能なコマンドがあります。 通信ソフトウェアが動き出すと、モデムを設定するためにコマンドの「初期化」 文字列をモデムに送ります。モデムがダイヤルする(あるいは電話を受ける)前 に、すべてのコマンドが通常のデータ通信線を用いて送られます。

モデムを他のモデムに接続した(オンラインモードの)とき、コンピュータから モデムへ送ったすべてのデータはもう一方のモデムへ直接到達し、コマンドの ようにモデムが解釈することはありません。オペレーションモードから、送信 データすべてをモデムが解釈するコマンドモードへ「エスケープする」方法が あります。コンピュータが特定の時間間隔で ``+++''のみを送信します。 この間隔が正しければ、モデムはコマンドモードへ復帰します。もうひとつの 方法はモデム制御線に信号を送ることです。

インターネット上には多くのモデムコマンドのリストがあります。 Web サイト の節では、こういったウェブサイトへの リンクを載せています。異なった型番やブランドのモデムは、異なったコマン ドセットを使用します。従って、あるモデムのコマンドが他のモデムでは動作 しない可能性があります。(すべてのモデムで動作する保証はありませんが)共 通のコマンドは、この HOWTO の モデムの設定 の節に載せてあります。

4.12 シリアル操作ソフトウェア: デバイスドライバモジュール

シリアルポート用のデバイスドライバは、シリアルポートを操作するソフ トウェアです。現在はこれはシリアルモジュールとして用意されています。こ のモジュールは普通、必要なときに自動的に読み込まれます。バージョン 2.2 以降のカーネルはこれを行います。これより古いカーネルでは、必要なときにモ ジュールを自動的に読み込むためには kerneld を実行する必要がありま した。これを行わない場合には、/etc/modules に明示的に列挙する 必要がありました。モジュールが Linux で一般的になる前は、シリアルドラ イバはカーネルに組み込むのが普通でした。もし、シリアルドライバがまだカー ネルに組み込んであるのなら(カーネルのコンパイル時にそう選択したのかも しれません)、シリアルモジュールをロードしてはいけません。もしこれをロー ドしてシリアルドライバが 2 つになってしまうと、シリアルポートは使えな くなります。この場合にシリアルポートをオープンしようとすると ``I/O error'' となります。

シリアルモジュールが読み込まれると、存在するシリアルポートに関するメッ セージが画面に表示されます(間違った IRQ を表示することもよくあります)。 しかし、一度 setserial を使ってデバイスドライバに(たぶん)正しい IRQ を教えれば、次には一度目と似た形式で正しい IRQ 等が表示されるはず です。setserial の詳細については setserial とは何か? をご覧ください。

カーネルのソースコードを編集してドライバを修正することができます。シリ アルドライバの大部分は serial.c ファイルにあります。シリアルポー トを使うプログラムの詳しい書き方については、Serial-Programming-HOWTO をご覧ください(現在 Vern Hoxie さんが改訂中です)。

[訳注 : JF プロジェクトによる日本語訳 Serial-Programming-HOWTO ]


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