/etc/printcap には 5 つの設定項目があり、これを設定することに
よって、プリンタが接続されているシリアルポートの設定を全て制御すること
ができます。
printcap
のオンラインマニュアルを読んで、br#, fc#,
xc#, fs#, xs# の意味を覚えておいてください。
この属性のうち最後の 4 つは、ポートの使い方の設定を示すフラグ設定です。
br# は単なるボーのレートであり、例えば `br#9600
' のよ
うに設定します。
stty の設定を printcap のフラグ設定に書き直すのはとても簡単です。書き直す必 要があるならば、とりあえず stty のオンラインマニュアルを見るといいでしょ う。
stty を使ってプリンタポートを設定し、ファイルを cat コマンドで流し込め ば正しく印刷できるようにしましょう。筆者のプリンタポートの設定では、 `stty -a' の出力は以下のようになります -
dina:/usr/users/andy/work/lpd/lpd# stty -a < /dev/ttyS2
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0
bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase
-tostop -echoprt -echoctl -echoke
この設定とシステムの起動時に初期化される設定との違いは、
-clocal
, -crtscts
, ixon
だけです。シリアルポートの設定
は、プリンタがどのようにフロー制御を行っているのかによって変わってくる
ことがあります。
実際のところ、stty コマンドの使い方はちょっと珍しいものです。stty は
stty の標準入力に接続されている端末を操作するので、与えられた
シリアルポートの操作は、先の例のように `<
' 文字を使って行いま
す。
stty の設定がうまくできたら(`cat file > /dev/ttyS2' (筆者の場合)でファイルをプリンタに送れるようになります)、次は /usr/src/linux/include/asm-i386/termbits.h ファイルを見てください。 このファイルにはたくさんの #define といくつかの構造体が書かれています (このファイルをプリンタに cat コマンドで送り(ちゃんと動きますか?)、こ れを下書き用紙にするとよいでしょう)。以下の部分から始まるセクションを 見つけてください。
/* c_cflag bit meaning */
#define CBAUD 0000017
このセクションには fc# ビットと fs# ビットの意味が列
挙されています。読者の皆さんも、ボーのレートの後にあるそれぞれの名前が
stty コマンドの出力行のどれかと一致することに気づかれることでしょう。
これは簡単だろうっていいませんでしたっけ?
stty コマンドの出力では、これらの設定それぞれの前に「-」が付く点に注意
してください。これらの数(8 進値です)を全て足してみてください。これは
クリアしようとしているビットを表すので、その結果は fc# の
ケーバビリティとなります。もちろん、クリアを行った後に直接ビット値を設
定することもできるので、単に `fc#0177777
' を使うこともできま
す(筆者はそうしています)。
今度は、stty コマンドの出力において頭に「-」が付いていない設定(同じ
セクションにあるもの)についても同じことを行ってください。本文の例で重
要なのは CS8 (0000060), HUPCL (0002000), CREAD (0000200) です。
ボーレート(筆者の場合は 0000015)を表すフラグも覚えておきましょう。これ
らを全部足し合わせてください。本文の例ではこの値は 0002275 になります。
これが fs# の機能です(本文の例では
`fs#02275
' でうまく動作しています)。
このインクルードファイルの次のセクションである「c_lflag ビット」につい
ても、設定とクリアを同じように行ってください。筆者は何も設定しておらず、
`xc#0157777
' と `xs#0
' だけを使っています。
Jon Luckey さんの指摘によると、シリアルインタフェースが安物でバッファ
も小さいシリアルプリンタには、フロー制御の際に本当に止まってしま
うものもあるそうです。
この文字落ちの問題を回避するために彼が見つけた方法は、
setserial
コマンドを使って Linux マシンの 16550 シリアルポートの FIFO を無効にす
ることです(これを行うには、単に UART のタイプとして 8250 を指定すれば
良いみたいです)。