ここで言う "速度" は本当は「データフローレート(data flow rate)」と いう意味なのですが、大抵の人はこれを速度と誤用しています。速度の単位は ビット/秒(あるいはボー)です。速度は "stty" コマンドまたはシリアルポー トを使うプログラムで設定します。 stty をご覧ください。
ハードウェアがサポートしている最大速度を知る必要があります。1998 年 末の時点では、ほとんどのハードウェアが 115.2k bps までの速度をサポート しています。いくつかの 56k 内蔵モデムは 230.4k bps をサポートしていま す。最近の Linux カーネルは高速(115.2k 以上)対応していますが、以下の理 由のいずれかあるいは両方のために、対応が困難な場合があります:
普通使われる除数とそれに対応する速度(最大速度は 115,200 とします)の リストを示すと 1 (115.2k), 2 (57.6k), 3 (38.4k), 6 (19.2k), 12 (9.6k), 24 (4.8k), 48 (2.4k), 96 (1.2k) などとなります。シリアルドライバは、 ハードウェアに「除数」(正の整数)を送ることによってのみハードウェアの速 度を設定します。この「除数」でハードウェアの最大速度が割り算され、遅い 速度となります(ただし除数が 1 の場合だけは明らかに、ハードウェアに 最大速度で動作するよう命令します)。
普通は(通信プログラムや stty で)速度を 115.2k に指定すると、シリアルド ライバはポートのハードウェアに除数 1 を設定します。これは明らかに最高 速度の設定です。お使いのハードウェアの最高速度が例えばたまたま 230.4k ならば、115.2k を指定した時の除数が 1 であるため、実際の速度は 230.4k になります。これにより設定した速度の倍の速度になります。実際、どんな速 度を指定しても実際の速度は倍になってしまいます。460.8k で動作できるハー ドウェアがあったとすると、実際の速度は設定値の 4 倍となるでしょう。
こういった計算を正しくさせるには(しかし必ずしも問題が解決するとは限
りません)、"setserial" を使って baud_base 値を実際のポートの最大速度
(例えば 230.4k)に変更します。そうすると(アプリケーションや stty を使っ
て)速度を 230.5k にした場合に除数として 1 が使われ、設定したのと同じ速
度が得られます。しかし問題があります: (1999 年半ばの時点では)stty や多
くの通信プログラムは最大速度の設定値が 115.2k であり、230.4k 等を設定
することができないのです。したがって、このような場合の一つの解決方法は、
setserial
では何も変更せず、実際の速度は設定した速度の 2 倍である
ことを自分で覚えておくことです。
あまりマシとは言えませんが、別の回避策もあります。この方法を使うには、
(setserial を使って) baud_base 値をハードウェアの最大速度にしてくださ
い。これにより計算方法が正しくなり、115.2k を指定すれば実際に 115.2k
の速度が得られるようになります。ここでもまだ、通信プログラムなどが最高
速度を設定させてくれない場合に、最高速度を設定する方法を見つける必要が
あります。幸運なことに、setserial にはこれを行う方法があります:
"divisor 1" として "spd_cust" パラメータを使うのです。すると、通信プロ
グラムで速度を 38400 とした時にポート内の除数は 1 に設定され、最高速度
で動作します。例:
setserial /dev/ttyS2 spd_cust baud_base 230400 divisor 1
"divisor" を先に説明した(spd_cust と組み合わせる)特殊な用途以外の目的
で使ってはいけません。
通信プログラムで設定できない速い速度を 2 つ以上使いたい場合には、先の 説明ほど簡単には行きません。しかし同じ原則が当てはまります。baud_base 値は単にデフォルトのままにしておき、速度を設定する時には実際は除数しか 設定していないと考えるのです。したがって実際の速度は常に、シリアルドラ イバが設定した除数で最大速度を割った値となります。 ハードウェアに速度を設定する方法: 除数と baud_base 値 をご覧ください。
baud_base 値の設定は普通、ハードウェア内の水晶発振器の周波数よりずっ と低い点に注意してください。というのも、水晶発振器の周波数はハードウェ ア内で 16 で割られ、実際の最高速度となることが多いからです。水晶発振器 の周波数の方が高くなければならない理由は、このように周波数が高速ならば、 各ビットが 1 か 0 であるかを決めるためのサンプルをたくさん取ることがで きるからです。
(E)IDE のハードディスクを使っているシステムであり、かつスループットが
悪くてシリアルポートがオーバーランする場合は hdparm
を試して
ください。これは (E)IDE のパラメータ(ディスクの IRQ が発行されている間
は他の IRQ をアンマスクする等)を変更可能にするユーティリティです。この
ユーティリティを使うと応答が良くなってオーバーランを無くすのに役立つでしょ
う。ただし、オンラインマニュアルは必ずよく読んでください。というのも、
一部のドライブとコントローラの組合せではこのユーティリティがうまく動作
せず、ファイルシステムを壊してしまうかもしれないからです。
irqtune
と呼ばれるユーティリティも試してください。これはデバ
イス(例えばモデムが繋がっているシリアルポート)の IRQ の優先度を変更す
るユーティリティです。これにより、お使いのシステムのシリアルポートのス
ループットが向上するかもしれません。irqtune
の FAQ は
http://www.best.com/~cae/irqtune
にあります。