11.7. Correção de Erros

Apos realizar um teste simples com o comando lptest(1), você pode ter obtido um desses resultados ao invés do funcionmamento correto da saída:

Ela funciona por um tempo e para; ou não ejeta a folha toda.

A impressora parece imprimir, mas você aguarda e ela não faz nada. De fato, você deve pressionar o botão de PRINT REMAINING ou ALIMENTAÇÃO de folha para obter algum resultado.

Se esse é o caso, a impressora provalvelmente está aguardando para ver ser recebe mais algum dado para seu trabalho de impressão antes de imprimir qualquer outra coisa. Para corrigir este problema, você deve term um filtro de texto para enviar o caracter FORM FEED ( alimentação de folha ) ou qualquer outro necessário para a impressora. Isso é sufuciente para a maioria dos casos, pos faz com que a impressora imprima o restante das informações presentes no buffer interno. Isso também é útil para ser ter certeza que o trabalho de impressão terminou e o próximo irá iniciar em uma nova folha, e não colado com o anterior.

O shell script a seguir imprime o caracter de alimentação de folha na impressora; o arquivo é: /usr/local/libexec/if-simple

#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout.  Ignores all filter arguments.
# Writes a form feed character (\f) after printing job.

/bin/cat && printf "\f" && exit 0
exit 2
Ela produz o efeito ``escada.''

Você pode ter o seguinte resultado:

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

Você pode vir ser mais uma vítima do efeito escada, que é causado pelo conflito de interpretação dos caracteres que deveriam indicar uma nova linha. O estilo dos sistemas operacionas UNIX® utilizam um único caracter para representar uma nova linha: o caracter ASCII código 10, o alimentação de linha (LF - line feed). O MS-DOS®, OS/2®, e outros sistemas operacionais usam o par de caracteres com os códigos ASCII 10 e 13 ( o caracter de retorno de carro (CR)). Muitas impressoras usam a convesão do MS-DOS para representrar uma nova linha.

Quando você imprimir com o FreeBSD, você deverá usar em seu texto o caracter de alimentação de linha, que avança o papel para próxima linha, mas mantém a mesma posição horizontal na página para a impressão do próximo caracter. É isso que o caracter de retorno de carro faz (CR); move para o canto esquerdo a posição da próxima impressão do caracter.

Aqui está o que o FreeBSD espera que sua impressora faça:

A impressora Recebeu CR A impressora Imprimiu CR
A impressora Recebeu LF A impressora imprimiu CR + LF

Aqui, algumas maneiras para solucionar isto:

  • Use as chaves de configuração, no painel de controle da impressora para alterar a interpretação desses caracteres. Verifique o manual da sua impressora para encontrar como fazer isso.

    Nota: Se você utiliza um outro sistema operacional além do FreeBSD, você deve reconfigurar a impressora parausar a interpretação dos caracteres CR e LF desse sistema. Você deve dar preferencia a outras soluções, como mostrada abaixo.

  • Ter um driver serial para FreeBSD converter o caracter LF em CRLF. Claro, ele trabalha somente com impressoras na porta serial. Para habilitar essa função, use a opção ms# e coloque o modo onlcr no arquivo /etc/printcap.

  • Enviar um código escape para a impressora para term um tratamento temporário diferente do caracter LF. Condulte o manual de sua impressora para conhecer as sequências escape que sua impressora pode suportar. Quando você encontrar o código correto, modifique o filtro texto para enviar este código inicialmente, para apos enviar o arquivo a ser impresso.

    Aqui tem um exemplo de filtro texto para as impressoras que reconhecem os códigos da linguagem PCL da Hewlett Packard. Esse filtro faz a impressora tratar os caracteres LF como sendo uma sequência de LF + CR; entao ele envia o arquivo; então ele envia um caracter FF ( alimentação de formulário ) para ejetar a última página do arquivo. Ele deve funcionar com todas as impressoras da Hewlett Packard.

    #!/bin/sh
    #
    # hpif - Simple text input filter for lpd for HP-PCL based printers
    # Installed in /usr/local/libexec/hpif
    #
    # Simply copies stdin to stdout.  Ignores all filter arguments.
    # Tells printer to treat LF as CR+LF.  Ejects the page when done.
    
    printf "\033&k2G" && cat && printf "\033&l0H" && exit 0
    exit 2
    

    Aqui um exemplo do /etc/printcap de um computador chamado orchid. Ele tem uma única impressora ligada a ele na primeira porta paralela, uma Hewlett Packard LaserJet 3Si, chamada de teak. Ele esta usando o script acima como um filtro de texto:

    #
    #  /etc/printcap for host orchid
    #
    teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
            :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
            :if=/usr/local/libexec/hpif:
    
A Impressora Sobreescreve as linhas.

A impressora nunca avança para linha abaixo. Todas as linhas do texto são impressas no topo da página e uma sobre as outras.

Esse problema é o ``oposto'' do efeito escada, descrito acima, e muito mais raro. Em algum lugar, o caracter LF que é usado pelo FreeBSD como final de linha, é tratado como o caracter CR, que retorna a cabeça de impressão para o inicio da linha, mas não move uma linha para baixo, como deveria ser.

Use as chaves de configuração da impressora ou o painel de controle para forçar a seguinte interpretação dos carateres LF e CR.

Impressora Recebe Impressora Imprime
CR CR
LF CR + LF
A Impressora Perde Caracteres.

Enquanto está imprimindo, a impressora não imprime alguns caracteres po linha. O problema pode estar na configuração raw, perdendo mais e mais caracteres.

O problema é que a impressora não pode manter a velociade a qual o computador está usando para enviar os dados pela porta serial ( esse problema não deve ocorrer na porta paralela). Existem duas maneiras de solucionar o problema:

  • Se a impressora suportar o controle por XON/XOFF, o FreeeBSD irá usa-lo se for especificado o modo ixon na opção ms#.

  • Se a impressora suportar carrier flow control, especifique o modo crtscts na opção ms#. Tenha certeza que o cabo que conecta a impressora ao computador esteja corretamente feito para carrier flow control,

A Impressora Imprime Lixo.

A impressora aparentemente imprime lixo randômico e não o texto solicitado.

Esse é outro sintoma de parâmetros incorretos da comunicação com a impressora serial. Verifique novamente os valores nas opções da taxa bps ( br ) e da paridade ( ms# ); tenha certeza das configurações especificadas no arquivo /etc/printcap.

Nada Acontece.

Se nada acontecer, o problema, provavelmente, está dentro do FreeBSD e não no hardware. Adicione a opção (lf) no arquivo /etc/printcap na impressora que você está verificando. No nosso exemplo, estamos utilizando a impressora rattan, com a opção 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

Então, tente novamente. Verifique o arquivo de log ( no nosso exemplo, /var/log/rattan.log) para ver qualquer mensagem de erro que possa aparecer. Baseado nessas mensagens, você poderá corrigir o problema.

Se você não especificar a opção lf o LPD usará /dev/console como padrão.

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.