Lpd besitzt 5 Attribute, die in der /etc/printcap
eingestellt
werden können, um die Einstellungen des seriellen Ports zu kontrollieren.
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, möge man nun die man page für stty betrachten.
Man benutzt stty um den Druckerport einzustellen, so daß man ein File
an ihn `catten' kann. So kann `stty -a
' aussehen:
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 diesem und der Initialisierung
beim Booten sind -clocal
, -crtscts
und ixon
. Die
benötigten Einstellungen können auch anders sein, abhängig von der
Flußkontrolle des Druckers.
Man kann stty auf eine etwas ungewöhnliche Weise verwenden. Weil stty
auf dem Terminal, das mit seinen Standardinput verbunden ist, arbeitet,
kann man damit einen seriellen Port manipulieren, indem man `<
'
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/linux/termios.h
betrachten. Diese Datei enthält viele #defines und einige structs
(man sollte diese Datei auf den Drucker catten (das funktioniert ja
jetzt) und als Notizpapier 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. Es fällt auf, daß die Namen (nach den
Baudraten) mit einer der stty-Ausgabeleitungen übereinstimmen. Es wird
wirklich leicht...
Einige dieser Einstellungen fangen mit einem - in der stty-Ausgabe an.
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.
Natürlich setzt man diese Bits direkt nach dem Löschen, also kann man
einfach `fc#0177777
' verwenden.
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). Man beachte auch die Flags für die Baudrate (z.B.
0000015). Man addiert alle zusammen und bekommt im Beispiel 0002275
heraus. Das kommt in die fs#
- Einstellung (`fs#02275
'
funktioniert gut beim Autor).
Man macht das gleiche mit "set" und "clear" für den nächsten Anschnitt
der Includedatei, "c_lflag bits"
. Der Autor mußte nichts einstellen
und verwendet 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 abstellen kann, indem man an einer 16550er seriellen
Schnittstelle mit
setserial
den FIFO ausschalten (man muß scheinbar nur den UART-Typ als 8250
einstellen).