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
'.
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).