17. lpd 下的串行打印机

串行打印机在 lpd 下相当棘手。

17.1. 在 printcap 中设置

Lpd 提供了五个属性,您可以在/etc/printcap 中设置它们来控制打印机所连接的串行端口的所有设置。阅读 printcap 手册页,并注意 br#fc#xc#fs#xs# 的含义。后四个属性是位图,指示端口使用的设置。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 设置正确,使得 `cat file > /dev/ttyS2' (在我的例子中)将文件发送到打印机,请查看文件 /usr/src/linux/include/asm-i386/termbits.h。这包含了很多 #defines 和一些结构体(您可能希望将此文件 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 文件的下一节“c_lflag bits”的设置和清除执行相同的操作。在我的例子中,我不需要设置任何东西,所以我只使用 `xc#0157777' 和 `xs#0'.

17.2. 较旧的会丢弃字符的串行打印机

Jon Luckey 指出,一些带有廉价串行接口和小缓冲区的较旧串行打印机真的会在它们通过流量控制说停止时停止。他发现使用以下命令禁用他的 Linux 机器的 16550 串行端口中的 FIFOsetserial纠正了字符丢失的问题(您显然只需将 UART 类型指定为 8250 即可做到这一点)。