15. Les imprimantes série

Contenu de cette section

Le démon lpd fournit cinq attributs que vous pouvez positionner dans /etc/printcap afin de contrôler le port série sur lequel se trouve votre imprimante.

br 
     (numerique) definit le taux de transfert en bauds (appel a ioctl(2)) 
fc 
     (num) efface des indicateurs (sgtty.h)
fs 
     (num) positionne des indicateurs (inverse de `fc')
xc

xs

Pour définir la vitesse du port, la syntaxe est évidente. Exemple: br \#9600.

Les autres paramètres à positionner correspondent à un ensemble de bits, que l'on pourra soit positionner, soit mettre à 0. Pour effacer des bits, on utilisera les paramètres fc et xc, pour les positionner, fs et xs.

Faites bien attention aux bits que vous sélectionnez. Mais au fait que sont-ils ? Souvenez-vous..., la commande stty. Elle indique de nombreux paramètres caractérisant un tty. La commande stty -a affiche en clair les paramètres du tty, certains d'entre-eux étant précédés d'un tiret s'ils sont invalidés et sans tiret s'ils sont validés. La commande stty peut être appliqués au port série (voir exemple). Ce sont certains de ces paramètres (des drapeaux, des flags, donc des bits) que l'on va manipuler.

     # 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

Note: utilisez toujours stty de cette façon (stty < /dev/ttyS?); cette command utilise en effet l'entrée standard).

Vous pouvez utiliser cette commande pour configurer le port de façon à obtenir une impression correcte. Par exemple, les différences que l'on peut noter entre le stty ci-dessus et l'initialisation du port au démarrage de ma machine réside dans les informations -clocal, -crtscts et ixon. (La configuration de votre port pourra très bien être différente selon la manière dont votre imprimante gère le contrôle de flux).

Votre port étant bien configuré, faites : cat fichier > /dev/ttyS? (? est le numéro de votre port) pour imprimer un fichier.

Imprimez par exemple le fichier /usr/src/linux/include/asm-i386/termbits.h. Vous y découvrirez un tas de définitions de constantes et de structures. Nous allons voir quelles valeurs définies dans ce fichier vont nous servir pour configurer le port, non plus avec stty, mais avec les paramètres fc, xc, fs et xs du fichier printcap. Regardez la section commençant par :

     /* c_cflag bit meaning */
     #define CBAUD   0010017

Elle décrit justement les bits manipulables à l'aide de fc et fs dont on parlait. On y voit les constantes des vitesses de modulation en baud, puis des lignes qui nous intéressent particulièrement : ce sont les mêmes paramètres que dans la commande stty. Je sens que vous voyez où on veut en venir. stty n'est qu'un interface nécessaire au positionnement (ou effacement) de bits.

Vous savez maintenant que chaque paramètre affiché par stty correspond à un bit, et qui ont la valeur 0 lorsqu'il y a un tiret devant. Notez alors les bits à effacer (ce sera fait avec la paramètre fc) et ceux à positionner (paramètre fs). Exemple: `fc\#0177777' (Attention le paramètre fc semble surcharger le paramètre br, donc prenez garde à les positionner correctement).

Ensuite occupez-vous des bits à positionner. Par exemple s'il faut positionner les bits cs8, hupcl et cread, regardez les constantes CS8 (0000060), HUPCL (0002000) et CREAD (0000200). Pensez à la vitesse de modulation qu'il faut aussi définir, dans mon cas, ce sera B9600 (0000015). Tous ces bits ensemble font `0002275'. Indiquez cette valeur au paramètre fs.

Effectuez les même réglages avec la section suivante intitulée

     /* c_lflag bits */

Dans mon cas je n'ai rien à positionner, j'ai donc simplement à fournir la valeur xc\#0157777, puis xs\#0. Une fois votre fichier printcap correctement défini, essayez d'imprimer. Si quelque chose ne va pas, continuez à lire les paragraphes suivants.

Souvenez-vous de toujours commencer par les bits que vous souhaitez voir à 0 (fc et xc), puis de définir seulement après des bits à positionner (fs et xs).

La commande cat fonctionne pour le port série, mais pas lpd

La mise en place de lpd n'est pas traitée ici, mais sachez que si vous avez des problèmes avec la configuration du port série, vous pouvez empêcher lpd de le configurer en considérant votre imprimante comme ne présentant pas une interface normale. Lisez également à ce propos le chapitre suivant.

Donnez à votre imprimante le périphérique /dev/null1 (mknod /dev/null1 c 1 3). N'utilisez pas /dev/null, pour ne pas qu'il soit ouvert de manière exclusive. Enlevez les paramètres de vitesse et de positionnement des bits du fichier printcap.

Créez un shell-script comme ci-dessous :

         #!/bin/sh
         echo if: $* >> /var/spool/lpd/results
         # /dev/lp est un lien vers /dev/ttyS2 auquel est reliee l'imprimante
         exec votre_vieux_filtre $* > /dev/lp

...ou si vous n'avez pas de paramètre `if' configuré...

         #!/bin/sh
         echo if: $* >> /var/spool/lpd/results
         cat > /dev/lp
         # la commande ``echo -ne'' suppose que /bin/sh correspond a bash
         echo -en \\f > /dev/lp

Donnez-lui les droits de lecture/écriture pour tout le monde. Essayez-le: /usr/lib/lpd/if <FICHIER.

Définissez un filtre d'entrée dans votre fichier printcap pour appeler ce script. :if=/usr/lib/lpd/if:.

Utilisez la commande stty pour configurer le port correctement. Essayez d'imprimer. Vous devriez pouvoir déterminer si le(s) fichier(s) sont bien mis dans le répertoire de spool. Cela devrait imprimer, si votre essai manuel du script précédent a fonctionné. Bien entendu, le mieux serait de pouvoir se passer du script d'entrée et donc du paramètre if.

Supposons donc que la méthode précédente a fonctionné, et que vous pensez avoir correctement configuré votre fichier printcap. Exécutez la commande stty -a </dev/ttyS?. Si certains paramètres ne sont pas corrects, vérifiez les constantes du fichier termbits.h. Si la configuration est incorrecte, malgré tous vos efforts de vérification, n'hésitez pas à installer un démon récent.

15.1 Imprimantes anciennes et caractères perdus

Certaines anciennes imprimantes séries ont des petits tampons mémoire et gèrent mal le contrôle de flux. Supprimer le FIFO du port série (16550) avec setserial (faites croire à setserial que c'est un port 8250 et ça marchera).


Chapitre suivant, Chapitre Précédent

Table des matières de ce chapitre, Table des matières générale

Début du document, Début de ce chapitre