Inhalt

16. Serielle Drucker unter lpd

16.1 Einstellungen in der printcap

Lpd besitzt 5 Attribute, die in der /etc/printcap eingestellt werden können, um die Einstellungen des seriellen Ports zu kontrollieren, an den der Drucker angeschlossen ist. Man lese dazu die printcap Man-page und beachte die Bedeutungen von br#, fc#, xc#, fs# und xs#. Die letzten vier dieser Attribute sind Bitmaps, die für die Einstellungen dieses Ports stehen. Das br#-Attribut ist einfach die Baudrate, z.B. `br#9600'.

Es ist sehr einfach, die stty-Einstellungen in printcap Flags zu übersetzen. Wenn nötig, studieren Sie nun bitte die Man-page von stty.

Benutzen Sie stty, um den Druckerport so einzustellen, so daß man ein File an ihn mit cat schicken kann, und es korrekt ausgegeben wird. So sieht `stty -a' für meinen Druckerport aus:

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

Die einzigen Unterschiede zwischen diesen Einstellungen und der Initialisierung beim Booten sind -clocal, -crtscts und ixon. Ihr Port kann durchaus anders sein, abhängig von der Flußkontrolle Ihres Druckers.

Wirklich verwendet wird stty auf eine etwas ungewöhnliche Weise. Weil stty auf dem Terminal arbeitet, das mit seinen Standardinput ("stdin", d. Übers) verbunden ist, kann man damit einen seriellen Port manipulieren, indem man das `<'-Zeichen wie oben verwendet.

Sobald die stty-Einstellungen richtig sind, wenn also `cat file > /dev/ttyS2' (in meinem Fall) die Datei an den Drucker schickt, sollte man die Datei /usr/src/linux/include/asm-i386/termbits.h betrachten. Diese Datei enthält viele #defines und einige structs (man sollte diese Datei auf den Drucker ausgeben (das funktioniert ja jetzt, oder?) und als Vorlage verwenden). Man betrachte den Abschnitt, der mit

/* c_cflag bit meaning */
#define CBAUD   0000017

anfängt. Dieses Abschnitt listet die Bedeutungen der fc#- und fs#- Teile auf. Ihnen wird auffallen, daß die Namen (nach den Baudraten) mit einer der stty-Ausgabeleitungen übereinstimmen. Habe ich nicht gesagt, daß es leicht sein würde?

Achten Sie auf die Einstellungen, die mit einem - in der stty-Ausgabe anfangen. Wenn man alle diese Nummern aufsummiert (sie sind oktal), erhält man die Bits, die man löschen will. Also ist das die fc#-Einstellung. Erinnern Sie sich daran, daß Sie diese Bits direkt nach dem Löschen setzen werden, also können Sie einfach `fc#0177777' verwenden (ich mache es so).

Jetzt macht man das gleiche für die Einstellungen, die kein - vor sich haben. In dem Beispiel sind die wichtigen CS8 (0000060), HUPCL (0002000), und CREAD (0000200). Beachten Sie auch die Flags für die Baudrate (meine ist 0000015). Zählen Sie alle zusammen und Sie bekommen in diesem Beispiel 0002275 heraus. Das kommt in die fs#- Einstellung (`fs#02275' funktioniert in meinem Beispiel gut).

Machen Sie das gleiche mit "set" und "clear" für den nächsten Anschnitt der Includedatei, "c_lflag bits". Ich für meinen Teil mußte nichts einstellen und verwende deshalb `xc#0157777' und `xs#0'.

16.2 Ältere serielle Drucker, die Zeichen verschlucken

Jon Luckey hat festgestellt, daß einige ältere serielle Drucker mit 10-cent seriellen Interfaces und kleinen Buffern wirklich Stopp meinen, wenn sie das mit ihrer Flußkontrolle sagen. Er fand heraus, daß man das aufhörte, wenn er für den "16550"-Serialbaustein mit setserial den FIFO ausschaltete (man gibt offensichtlich nur den UART-Typ als "8250" an).


Inhalt