17. Stampanti seriali con lpd

Le stampanti seriali sono piuttosto difficili da usare sotto lpd.

17.1. Configurazione di printcap

Lpd fornisce cinque attributi da configurare in /etc/printcap per controllare le impostazioni della porta seriale a cui è collegata la stampante. Si legga la pagina di manuale di printcap e si prenda nota del significato degli attributi br#, fc#, xc#, fs# e xs#. Gli ultimi quattro sono mappe di bit che indicano le impostazioni della porta. L'attributo br# è semplicemente il baud rate, ad esempio " br#9600".

È molto semplice tradurre le impostazioni stty in attributi per printcap. Se ce n'è bisogno, si guardi ora la pagina di manuale di stty.

stty può essere usato per configurare la porta della stampante, in modo da poter fare il cat di un file sulla porta ed ottenere una stampa corretta. Nel mio caso «stty -a» fornisce le seguenti informazioni:


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
L'unica differenza tra questo ed il modo in cui la porta è inizializzata al boot è data da -clocal, -crtscts, e ixon. Le impostazioni della porta potrebbero essere differenti, a seconda di come la stampante effettua il controllo di flusso.

In realtà l'uso di stty è un po' strano. Dato che stty opera sul terminale collegato al suo standard input, lo si usa per manipolare una data porta seriale utilizzando il carattere "<" come sopra.

Dopo aver configurato correttamente le impostazioni di stty, in modo che «cat file > /dev/ttyS2» (nel mio caso) invii il file alla stampante, si guardi il file /usr/src/linux/include/asm-i386/termbits.h. Questo file contiene molti #defines ed alcune strutture (si potrebbe farne il cat sulla stampante (che ormai funziona) e usarlo come punto di partenza). Si veda la sezione che comincia con

/* c_cflag bit meaning */
#define CBAUD   0000017
Questa sezione elenca i significati dei bit fc# ed fs# i cui nomi (dopo il baud rate) coincidono con una delle linee dell'output di stty. Non è forse facile?

Annotare quali di questi settaggi sono preceduti da un - nell'output di stty e sommare tutti questi numeri (sono in ottale). Questo rappresenta i bit che vanno azzerati, così il risultato è la capacità di fc# . Naturalmente ci si ricordi che poi i vari bit verranno impostati direttamente dopo essere stati azzerati, pertanto si potrà semplicemente usare "fc#0177777" (io lo faccio).

Ora fare lo stesso per quei settaggi (elencati in questa sezione) che non hanno un - davanti nell'output di stty. Nell'esempio i più importanti sono CS8 (0000060), HUPCL (0002000), e CREAD (0000200). Controllare anche il flag relativo al baud rate (il mio è 0000015). Sommare tutti questi numeri, ottenendo nell'esempio 0002275. Questo numero viene messo nelle capacità di fs# ("fs#02275" funziona correttamente nell'esempio).

Ripetere il procedimento di azzeramento e impostazione dei bit nella successiva sezione del file di include, "c_lflag bits". Nell'esempio non c'è niente da impostare, quindi vengono usati " xc#0157777" e "xs#0".

17.2. Stampanti seriali antiquate che perdono caratteri

Jon Luckey ha evidenziato come alcune stampanti seriali con interfacce da due lire e buffer molto piccoli intendono veramente fermarsi quando lo indicano attraverso il controllo di flusso. Jon ha scoperto che disabilitando il buffer FIFO della porta seriale 16550 tramite setserial si risolve il problema della perdita dei caratteri (in pratica specificando il tipo UART della porta seriale come 8250).