Na het uitvoeren van een simpele test met lptest(1) is mogelijk een van onderstaande resultaten verkregen, in plaats van de juiste uitvoer:
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
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.
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 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 |
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.
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.
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.