Next Previous Contents

16. 在 lpd 下使用序列式印表机

16.1 设定 printcap

Lpd 在 /etc/printcap 中提供了五个可以设定的属性, 让你用来控制印表机所连接的序列埠的设定. 阅读 printcap 的线上手□(man page), 并请注意 br#, fc#, xc#, fs#xs# 的意义. 其中最後的四个属性是位元组列(bitmap), 用来代表该序列埠的使用设定. 而 br# 属性只是单纯的鲍率(baud rate), 例如 `br#9600'.

要将 stty 的设定转换为 printcap 的旗标设定(flag settings) 非常简单. 假使你需要, 请现在就看看 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. 根据你的印表机的流量控制(flow control) 方式, 你的设定可能会不同.

实际上, 你是以特殊的方式使用 stty. 因为 stty 的对象是连接在标准输入(standard input) 上的终端机装置, 你是用如上所示的 `<' 字元, 来使得 stty 处理所指定的序列埠.

只要你的 stty 设定正确, `cat file > /dev/ttyS2' (在我的例子中) 就可以将档案送到印表机了, 请看一下这个档案 /usr/src/linux/include/asm-i386/termbits.h, 它包含了很多的 #define 和一些 struct (你可能想把它 cat 到印表机 (已经可以用了吧, 对不对?), 然後把它当做便条纸). 找到下面这一行:

/* c_cflag bit meaning */
#define CBAUD   0000017
这一段列出了 fc#fs# 位元的意义. 你会发现到那儿的名称 (在鲍率之後) 和 stty 输出的结果其中一行相符合, 我不是说这会很容易吗?

找到那些在你的 stty 结果中前面有减号(-) 的设定, 把那些数字(是八进位的) 加起来. 这代表了你要清除的位元, 结果就是你的 fc# 能力. 当然你也可以直接用 `fc#0177777' (我就是), 因为你将会在清除之後立刻设定这些位元.

现在对那些在 stty 的结果中没有减号在前面的设定 (在这一段中所列出的) 做同样的事. 在我的例子中, 重要的设定有 CS8 (0000060), HUPCL (0002000), 和 CREAD (0000200). 同时也找到代表你的鲍率的旗标 (我的是 0000015), 把它们统统加起来, 在我的例子中会得到 0002275. 这就是你的 fs# 能力 (`fs#02275' 在我的例子中运作的很好).

用同样的方式针对这个标题档(include file) 中的下一段, "c_lflag bits", 做设定和清除的动作. 在我的例子中我不需要设定任何东西, 所以只要用 `xc#0157777' 和 `xs#0' 就可以了.

16.2 会掉字的旧型序列式印表机

Jon Luckey 指出有些具有 ten-cent 序列介面和小缓冲区的旧型的序列式印表机, 当使用流量控制时, 说停止就是真的表示停止. 他发现用 setserial 停用他的 Linux 机器的 16550 序列埠的 FIFO 功能後, 掉字的问题就解决了 (如果你要这样做, 似乎只要将 uart 的种类指定为 8250 就可以了).


Next Previous Contents