10.7. Problembehandlung

Wenn Sie eine einfache Testseite mit lptest(1) gedruckt haben, könnte eines der folgenden Probleme aufgetreten sein:

Der Druck hat erst mit einer gewissen Verzögerung geklappt oder das bedruckte Blatt verblieb im Drucker, so als wäre der Druckvorgang noch nicht abgeschlossen.

Die Testseite wurde zwar gedruckt, danach tat sich allerdings nichts mehr. Vielleicht mussten Sie sogar eine Taste Ihres Druckers, etwa PRINT REMAINING oder FORM FEED drücken, damit der Druckvorgang fortgesetzt wurde.

Wenn das der Fall ist, hat der Drucker vermutlich vor dem eigentlichen Drucken gewartet, ob noch weitere Daten für Ihren Druckauftrag gesendet werden. Um dieses Problem zu beheben, können Sie den Textfilter anweisen, ein Form Feed -Zeichen (oder ein anderes entsprechendes Zeichen) an den Drucker zu senden. Dies reicht für gewöhnlich aus, um den Drucker zum Druck des noch im internen Puffer verbliebenen Textes zu bewegen. Dadurch kann auch sichergestellt werden, dass jeder neue Druckauftrag auf einer neuen Seite beginnt.

Der folgende Ersatz für das Shell-Skript /usr/local/libexec/if-simple gibt ein “Form Feed” aus, nachdem der Auftrag an den Drucker geschickt wurde:

#!/bin/sh
#
# if-simple - Einfacher Eingabefilter für lpd
# Installiert unter /usr/local/libexec/if-simple
#
# Kopiert stdin einfach nach stdout. Ignoriert alle Filter-Argumente.
# Schreibt ein Form-Feed-Zeichen (\f) nach dem Ende des Druckauftrages.

/bin/cat && printf "\f" && exit 0
exit 2
Der Drucker erzeugte einen “Treppeneffekt” (staircase effect).

Sie haben einen Ausdruck ähnlich dem folgenden erhalten:

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

Sie sind zu einem weiteren Opfer des Treppeneffekts geworden. Verursacht wird dieser Effekt durch unterschiedliche Ansichten darüber, welche Zeichen den Beginn einer neuen Zeile anzeigen sollen. UNIX®-ähnliche Betriebssysteme verwenden dafür ein einzelnes Zeichen: ASCII-Code 10, auch als Line Feed (LF) bekannt. MS-DOS®, OS/2® und andere Betriebssysteme verwenden stattdessen ein Zeichenpaar: ASCII-Code 10 und ASCII-Code 13, Carriage Return (CR). Viele Drucker verwenden in der Voreinstellung die Konvention von MS-DOS, um Zeilenumbrüche darzustellen.

Wenn Sie unter FreeBSD drucken, wird nur das Zeichen Line Feed verwendet. Der Drucker erkennt dieses Zeichen und erweitert den Druckbereich um eine Zeile, verbleibt zum Druck des nächsten Zeichens aber in derselben horizontalen Position. Das ist der Grund für die Verwendung des Carriage Return: Es setzt die Position für das folgende Zeichen auf den linken Rand der Seite.

FreeBSD erwartet von einem Drucker das folgende Verhalten:

Drucker empfängt CR Drucker druckt CR
Drucker empfängt LF Drucker druckt CR + LF

Es gibt mehrere Möglichkeiten, dieses Verhalten zu erreichen:

  • Verändern Sie die Konfiguration Ihres Druckers, um die Interpretation dieser Zeichen zu verändern. Lesen Sie Ihr Druckerhandbuch, wenn Sie nicht wissen, was Sie dazu tun müssen.

    Anmerkung: Wenn Sie auf Ihrem Rechner neben FreeBSD noch andere Betriebssysteme verwenden, müssen Sie Ihren Drucker möglicherweise anschließend erneut konfigurieren, damit die Zeichen CR und LF unter diesen Systemen korrekt interpretiert werden. Ist dies bei Ihnen der Fall, werden Sie wohl eine der folgenden Lösungen bevorzugen.

  • Lassen Sie LF durch den Treiber der seriellen Schnittstelle automatisch in CR+LF konvertieren. Selbstverständlich funktioniert dies nur mit Druckern, die an einer seriellen Schnittstelle angeschlossen sind. Um diese Möglichkeit zu nutzen, müssen Sie die ms#-Fähigkeit verwenden und in /etc/printcap den onlcr-Modus für den Drucker aktivieren.

  • Senden Sie eine Escape-Sequenz an den Drucker, damit das Zeichen LF zeitweilig anders behandelt wird. Suchen Sie im Handbuch Ihres Druckers nach den von Ihrem Drucker unterstützten Escape-Sequenzen. Wenn Sie eine entsprechenden Escape-Sequenz finden, müssen Sie den Textfilter so anpassen, dass zuerst die Escape-Sequenz und anschließend der Druckauftrag gesendet wird.

    Es folgt nun ein Bespieltextfilter für einen Drucker, der die Hewlett Packard PCL Escape-Sequenzen versteht. Dieser Filter veranlasst den Drucker, LF-Zeichen als Folgen von LF+CR aufzufassen. Anschließend wird der Druckauftrag gesendet. Als Abschluss wird ein Form Feed gesendet, um die letzte Seite des Druckauftrags auszuwerfen. Dieses Beispiel sollte mit nahezu allen Druckern von Hewlett Packard funktionieren.

    #!/bin/sh
    #
    # hpif - Einfacher Text-Eingabefilter für lpd für auf HP-PCL basierende Drucker
    # Installiert unter /usr/local/libexec/hpif
    #
    # Kopiert stdin einfach nach stdout.  Ignoriert alle Filterargumente.
    # Weist den Drucker an LF als CR+LF zu interpretieren.
    # Wirft die Seite nach dem Drucken aus.
    
    printf "\033&k2G" && cat && printf "\033&l0H" && exit 0
    exit 2
    

    Das nächste Beispiel aus /etc/printcap beschreibt den Rechner orchid, an dessen Parallelport ein Drucker angeschlossen ist. Es handelt sich dabei um einen Hewlett Packard LaserJet 3Si, der den Namen teak verwendet. Als Textfilter wird das Skript aus dem letzten Beispiel verwendet:

    #
    #  /etc/printcap für den Rechner orchid
    #
    teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
            :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
            :if=/usr/local/libexec/hpif:
    
Alle Zeilen wurden in die gleiche Zeile gedruckt.

Der Drucker hat niemals eine neue Zeile begonnen. Alle Zeilen des Textes wurden in eine einzige Zeile gedruckt.

Dieses Problem ist das “Gegenteil” des oben beschriebenen Treppeneffekts und kommt wesentlich seltener vor. Die von FreeBSD zum Abschluss einer Zeile benutzten LF-Zeichen werden als CR-Zeichen interpretiert. Dadurch wird die Druckposition zwar auf den linken Rand der Seite, aber nicht um eine Zeile nach unten gesetzt.

Konfigurieren Sie Ihren Drucker, um die folgende Interpretation der Zeichen LF und CR zu erzwingen:

Drucker empfängt Drucker druckt
CR CR
LF CR + LF
Manche Zeichen wurden nicht gedruckt.

Der Drucker hat in jeder Zeile einige Zeichen nicht gedruckt. Vielleicht ist das Problem auch während des Druckens schlimmer geworden, und der Drucker hat immer mehr Zeichen nicht gedruckt.

Dieses Problem entsteht, weil der Drucker mit der Geschwindigkeit, mit der die Daten über die serielle Schnittstelle (an einer parallelen Schnittstelle sollte das Problem nicht auftreten) eintreffen, nicht mithalten kann. Es gibt zwei Möglichkeiten, dieses Problem zu lösen:

  • Wenn der Drucker die Flusskontrolle mit XON/XOFF unterstützt, können Sie in der ms#-Fähigkeit den ixon-Modus aktivieren.

  • Unterstützt der Drucker die Anfrage zum Senden/Löschen des Sende-Hardware-Handshakes (allgemein bekannt als RTS/CTS, dann sollten Sie den crtscts-Modus in der ms#-Fähigkeit aktivieren. Stellen Sie aber sicher, dass das verwendete Druckerkabel auch für die Hardware-Flusskontrolle geeignet ist.

Es wurden nur wirre Zeichen gedruckt.

Anstelle des gewünschten Textes wurden nur zufällige Zeichen gedruckt.

Dieses Problem wird ebenfalls durch falsche Konfigurationsparameter im Zusammenhang mit einem seriellen Drucker verursacht. Kontrollieren Sie die bps-Rate in der br-Fähigkeit und die Paritätseinstellung (Parity) in der ms#-Fähigkeit. Überprüfen Sie außerdem, ob der Drucker auch tatsächlich die gleichen Einstellungen verwendet, die in /etc/printcap definiert wurden.

Der Drucker hat überhaupt nicht reagiert.

Wenn gar nichts passiert ist, dann liegt das vermutlich an FreeBSD und nicht am Drucker. Aktivieren Sie die Protokollierung (lf-Fähigkeit) für den entsprechenden Drucker in der Datei /etc/printcap. Es folgt nun ein Beispieleintrag für den Drucker rattan, bei dem die lf-Fähigkeit aktiviert wurde.

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

Versuchen Sie jetzt noch einmal zu drucken. Überprüfen Sie die Protokolldatei (in unserem Beispiel /var/log/rattan.log) auf etwaige Fehlermeldungen. Versuchen Sie aufgrund dieser Meldungen, das Problem zu beheben.

Wenn Sie keine Protokolldatei festlegen, verwendet LPD in der Voreinstellung /dev/console für die Ausgabe der Fehlermeldungen.

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.