10.7. Problemen oplossen

Na het uitvoeren van een simpele test met lptest(1) is mogelijk een van onderstaande resultaten verkregen, in plaats van de juiste uitvoer:

Het werkte na enige tijd of er kwam geen volle pagina.

De printer drukte bovenstaande af, maar wachtte enige tijd zonder iets te doen. Het was zelfs nodig om een PRINT REMAINING, of FORM FEED-knop op te printer in te drukken om enig resultaat te krijgen.

Als dit het geval is, dan stond de printer waarschijnlijk te wachten of er nog meer gegevens van de opdracht zouden komen, alvorens iets af te drukken. Om dit probleem op te lossen, kan het tekstfilter worden aangepast zodat deze een FORM FEED-karakter (of wat er ook nodig is) naar de printer stuurt. Dit is meestal voldoende om een printer zover te krijgen om tekst af te drukken die zich nog in de interne buffer bevindt. Het is ook nuttig om er zeker van te zijn dat elke afdrukopdracht eindigt op een hele pagina, zodat de volgende opdracht niet ergens midden op de laatste pagina van de vorige opdracht begint.

De volgende vervanging voor het shellscript /usr/local/libexec/if-simple drukt een form feed af nadat de opdracht naar een printer is gestuurd:

#!/bin/sh
#
# if-simple - Eenvoudige tekst invoerfilter voor lpd
# Geïinstalleerd in /usr/local/libexec/if-simple
#
# Kopieert eenvoudig stdin naar stdout.  Negeer alle filterargumenten.
# Schrijft een form feed karakter (\f) na het afdrukken van de opdracht.

/bin/cat && printf "\f" && exit 0
exit 2
De opdracht produceerde een getrapt effect.

Het resultaat ziet er als volgt uit:

!"#$%&'()*+,-./01234
                "#$%&'()*+,-./012345
                                 #$%&'()*+,-./0123456

Dit krijgen slachtoffers van het trapeffect te zien. Het wordt veroorzaakt door conflicterende interpretaties van de karakters die een regeleinde aangeven. UNIX®-achtige besturingssystemen gebruiken een enkel karakter: ASCII-code 10, de line feed (LF). MS-DOS®, OS/2® en andere besturingssystemen gebruiken twee karakters: ASCII-code 10 en ASCII-code 13 (de carriage return, CR). Veel printers gebruiken de MS-DOS-conventie voor het representeren van regeleinden.

Als onder FreeBSD wordt afgedrukt, bevat de tekst alleen het line feed-karakter. Na het zien van een line feed-karakter vervolgt de printer zijn werk op de volgende regel, maar behoudt dezelfde horizontale positie op de pagina voor het afdrukken van het volgende teken. Hier is de carriage return voor bedoeld: om het volgende karakter af te drukken aan de linkerkant van de pagina.

Dit is wat FreeBSD wil dat de printer doet:

Printer ontvangt CR Printer drukt CR af
Printer ontvangt LF Printer drukt CR + LF af

Hier volgen een aantal manieren om dit te bereiken:

  • Gebruik de instellingentoetsen of het bedieningspaneel van de printer om de interpretatie van deze karakters aan te passen. Controleer de handleiding van de printer om uit te vinden hoe dit moet.

    Opmerking: Als een systeem in een ander besturingssysteem dan FreeBSD wordt opgestart, kan het nodig zijn een printer opnieuw in te stellen, zodat die een interpretatie voor CR- en LF-karakters gebruikt die bij dat andere besturingssysteem horen. Het kan de voorkeur genieten een van onderstaande oplossingen te gebruiken.

  • Zorg dat het seriële lijnstuurprogramma van FreeBSD automatisch LF naar CR+LF converteert. Dit werkt natuurlijk alleen voor printers op een seriële poort. Gebruik de optie ms# en zet de modus onlcr in het bestand /etc/printcap voor de printer om deze functionaliteit in te schakelen.

  • Stuur een escape-code naar een printer om tijdelijk LF-karakters anders te behandelen. Raadpleeg hiervoor de handleiding van de printer om escape-codes te achterhalen die de printer ondersteunt. Als de juiste escape-code is gevonden, moet de tekstfilter worden aangepast zodat deze eerst de code stuurt en vervolgens de afdrukopdracht.

    Hier volgt een eenvoudig tekstfilter voor printers die HP PCL-escape-codes begrijpen. Dit filter zorgt dat een printer LF-karakters behandelt als LF en CR, vervolgens verstuurt het de opdracht en tot slot een form feed om de laatste pagina in de opdracht uit te voeren. Het zou met alle HP printers moeten werken.

    #!/bin/sh
    #
    # hpif - Eenvoudig tekst invoerfilter voor lpd voor HP PCL-printers
    # Geïnstalleerd in /usr/local/libexec/hpif
    #
    # Kopieert eenvoudig stdin naar stdout.  Negeert alle filterargumenten.
    # Vertelt de printer om LF te zien als CR+LF.
    # Werpt de pagina uit na voltooiing.
    
    printf "\033&k2G" && cat && printf "\033&l0H" && exit 0
    exit 2
    

    Nu volgt een voorbeeldbestand /etc/printcap voor host orchid. Er is een printer aangesloten op de eerste parallelle poort; een HP LaserJet 3Si, genaamd teak. Die gebruikt bovenstaand script als tekstfilter:

    #
    #  /etc/printcap voor host orchid
    #
    teak|hp|laserjet|HP LaserJet 3Si:\
            :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
            :if=/usr/local/libexec/hpif:
    
De regels zijn over elkaar afgedrukt.

De printer is nooit een regel opgeschoven. Alle regels tekst lopen over elkaar en zijn op dezelfde regel afgedrukt.

Dit probleem is het “omgekeerde” van het trapeffect, zoals boven beschreven, en is veel zeldzamer. Ergens worden de LF-karakters die FreeBSD gebruikt om een regel te eindigen gezien als CR-karakters om de afdruklocatie te verplaatsen naar de linkerkant van het papier, zonder óók een regel naar beneden te gaan.

Gebruik de instellingentoetsen, of het bedieningspaneel van de printer om de volgende interpretatie van LF en CR af te dwingen:

Printer ontvangt Printer drukt af
CR CR
LF CR + LF
De printer is karakters kwijt.

Tijdens het afdrukken heeft de printer een paar karakters per regel niet afgedrukt. Het kan zijn dat het probleem erger werd naarmate de printer zijn werk deed, steeds meer karakters verliezend.

Het probleem is dat de printer de snelheid waarmee de computer gegevens over een seriële lijn stuurt niet bij kan houden (dit probleem zou zich niet voor moeten doen met printers op een parallelle poort). Er zijn twee manieren om dit probleem te verhelpen:

  • Als de printer XON/XOFF flow-control ondersteunt, zorg dan dat FreeBSD dit gebruikt door de modus ixon in de optie ms# te specificeren.

  • Als de printer de Request to Send / Clear to Send hardware-handshake ondersteunt, (ook bekend als RTS/CTS), specificeer dan de modus crtscts in de optie ms#. Zorg dat de bedrading van de kabel die printer met de computer verbindt juist is voor hardware flow-control.

Er werd onzin afgedrukt.

Het lijkt alsof de printer willekeurige onzin afdrukte en niet de gewenste tekst.

Dit is meestal een ander symptoom van verkeerde communicatieparameters voor een seriële printer. Controleer de bps-snelheid in de optie br en de instelling voor pariteit in de optie ms#. Wees er zeker van dat de printer dezelfde instellingen gebruikt als in het bestand /etc/printcap worden opgegeven.

Er gebeurde niets.

Als er niets gebeurde, ligt het probleem waarschijnlijk bij FreeBSD en niet bij de hardware. Voeg de optie logboekbestand (lf) toe in /etc/printcap voor de betreffende printer. Hier is bijvoorbeeld de definitie voor rattan met de optie lf:

rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:\
        :lf=/var/log/rattan.log

Probeer vervolgens nogmaals af te drukken. Controleer het logboekbestand (in dit voorbeeld /var/log/rattan.log) op mogelijke foutmeldingen. Probeer op basis van deze melding het probleem te verhelpen.

Als er geen optie lf is opgegeven, gebruikt LPD /dev/console als standaard.