Capítulo 15 Comunicações Seriais

Essa seção cobre as perguntas mais comuns sobre comunicação serial com o FreeBSD. PPP e SLIP são abordados na seção Capítulo 12.

15.1. Como eu posso dizer se o FreeBSD encontrou minhas portas seriais?
15.2. Como eu posso dizer se o FreeBSD encontrou minha placa de fax modem?
15.3. Eu acabei de atualizar para a versão 2.0.5 e as minhas tty0X desapareceram! Como eu resolvo esse problema?
15.4. Como eu acesso as portas seriais no FreeBSD?
15.5. Como eu habilito suporte para uma placa serial de múltiplas portas?
15.6. O FreeBSD pode trabalhar com placas seriais de múltiplas portas compartilhando irqs?
15.7. Posso definir os parâmetros seriais padrão para uma porta?
15.8. Como eu habilito logins dial-up no meu modem?
15.9. Como eu conecto um terminal burro ao meu FreeBSD?
15.10. Por que eu não posso executar o tip ou o cu?
15.11. Meu modem modelo Hayes não é suportado - o que eu posso fazer?
15.12. Como posso entrar nestes comandos AT?
15.13. Porque o sinal <@> para a capacidade pn não funciona?
15.14. Como eu posso discar um número de telefone pela linha de comando?
15.15. Tenho que definir a taxa de bits por segundo sempre que fazer isso?
15.16. Como posso facilmente acessar vários hosts através de um terminal server?
15.17. O “tip” pode tentar discar mais de uma linha por vez?
15.18. Por que eu tenho que pressionar duas vezes o CTRL+P para enviar CTRL+P uma única vez?
15.19. Por que tudo o que eu digito inesperadamente está em CAIXA ALTA?
15.20. Como eu posso transferir arquivos com o tip?
15.21. Como eu posso executar o zmodem com o tip?
15.22. O FreeBSD pode vir a não encontrar minhas portas seriais, mesmo quando as configurações estão corretas?

15.1. Como eu posso dizer se o FreeBSD encontrou minhas portas seriais?

Assim que o kernel do FreeBSD é carregado, ele irá varrer as portas seriais do seu sistema procurando dispositivos nas portas configuradas no kernel. Pode-se observar atentamente as mensagens que o sistema exibe, ou então executar o seguinte comando:

% dmesg | grep sio

assim que o sistema estiver em funcionamento e execução.

Aqui estão alguns exemplos dos resultados do comando executado acima:

sio0 at 0x3f8-0x3ff irq 4 on isa
sio0: type 16550A
sio1 at 0x2f8-0x2ff irq 3 on isa
sio1: type 16550A

Eles mostram duas portas seriais. A primeira está na irq 4, está usando o endereço de porta 0x3f8, e tem um chip modelo UART 16550A. O segundo utiliza o mesmo tipo de chip mas está na irq 3 e seu endereço de porta é 0x2f8. Modems internos são tratados como se fossem portas seriais -- exceto que sempre tem um modem “conectado” à porta.

O kernel GENERIC tem suporte para duas portas seriais utilizando os mesmos irqs e configurações de endereços de portas do exemplo acima. Se tais configurações não estão certas para seu sistema, ou se você adicionou placas de modem ou tem mais portas seriais para o qual o kernel foi configurado, apenas recompile seu kernel. Veja a a seção de compilação do kernel para obter mais detalhes.

15.2. Como eu posso dizer se o FreeBSD encontrou minha placa de fax modem?

Refira-se à resposta da pergunta anterior.

15.3. Eu acabei de atualizar para a versão 2.0.5 e as minhas tty0X desapareceram! Como eu resolvo esse problema?

Não se preocupe, eles foram incluídos com os dispositivos ttydX. No entanto, você deve mudar todos os arquivos da configuração antiga que você tiver.

15.4. Como eu acesso as portas seriais no FreeBSD?

A terceira porta serial, sio2 (veja sio(4), conhecida como COM3 no DOS), está na /dev/cuaa2 para os dispositivos dial-out, e na /dev/ttyd2 para os dispositivos dial-in. Qual é a diferença entre essas duas classes de dispositivos?

Você utiliza ttydX para dial-ins. Quando o /dev/ttydX se abre no modo de bloqueio, um processo irá aguardar que o dispositivo cuaaX correspondente torne-se inativo, e aguarda a detecção do carrier detect da linha para ativar-se. Quando a cuaaX se abre, ela deixa claro que a porta não esta ainda em uso pelo dispositivo ttydX. Se a porta estiver disponível, ela é “roubada” do dispositivo ttydX. Além disso, o dispositivo cuaaX não se importa com o carrier detect. Com esse esquema de auto-resposta do modem, você pode ter usuários remotos conectando e você pode ainda discar para fora com o mesmo modem, que o sistema irá cuidar de todos os conflitos.

15.5. Como eu habilito suporte para uma placa serial de múltiplas portas?

Novamente, a seção de configuração do kernel provê informações sobre a configuração de seu kernel. Para uma placa serial de múltiplas portas, coloque uma linha sio(4) para cada porta serial da placa, no arquivo de configuração do kernel. Mas coloque o irq e as espeficicações do vetor apenas em uma das entradas. Todas as portas da placa devem compartilhar uma irq. Para consistência, utilize a última porta serial para especificar a irq. Além disso, especifique a opção COM_MULTIPORT.

O exemplo seguinte é para uma placa serial AST 4-portas na irq 7:

options "COM_MULTIPORT"
device sio4 at isa? port 0x2a0 tty flags 0x781
device sio5 at isa? port 0x2a8 tty flags 0x781
device sio6 at isa? port 0x2b0 tty flags 0x781
device sio7 at isa? port 0x2b8 tty flags 0x781 irq 7 vector siointr

As flags indicam que a porta master tem um “minor number” 7 (0x700), diagnósticos habilitados durante o escaneamento (0x080), e todas as portas compartilham uma irq (0x001).

15.6. O FreeBSD pode trabalhar com placas seriais de múltiplas portas compartilhando irqs?

Ainda não. Você deverá utilizar uma irq diferente para cada placa.

15.7. Posso definir os parâmetros seriais padrão para uma porta?

O ttydX (cuaaX) é um dispositivo regular que você vai querer abrir para suas aplicações. Quando um processo abre um dispositivo, ele tem um conjunto padrão de configurações de terminais de E/S. Você pode ver essas configurações com o comando

# stty -a -f /dev/ttyd1

Ao alterar as configurações para esse dispositivo, elas se manterão em efeito até que o dispositivo seja fechado. Quando ele for reaberto, vai para o estado padrão. Para fazer mudanças nos ajustes padrão, pode-se abrir e ajustar as configurações do “estado inicial” do dispositivo. Por exemplo, para ligar o modo CLOCAL, 8 bits, e o controle de fluxo XON/XOFF padrão para a ttyd5, faça:

# stty -f /dev/ttyid5 clocal cs8 ixon ixoff

Um bom lugar para fazer isso é no /etc/rc.serial. Agora, uma aplicação terá estas configurações por padrão quando abrir o ttyd5. No entanto, pode-se ainda modificar estas configurações a seu gosto.

Você pode prevenir certas configurações de serem modificadas por uma aplicação fazendo ajustes no dispositivo de “lock state”. Por exemplo, para travar a velocidade do ttyd5 em 57600 bps, faça:

# stty -f /dev/ttyld5 57600

Agora, uma aplicação, ao abrir o ttyd5, se tentar modificar a velocidade da porta, ficará travada a 57600 bps.

Naturalmente você deve garantir que os dispositivos de estado inicial e o estado de trava (lock) tenham permissão de escrita apenas para o root. O script MAKEDEV(8) NÃO faz isso quando ele cria as entradas de dispositivos.

15.8. Como eu habilito logins dial-up no meu modem?

Então você quer tornar-se um provedor de serviços internet, não é? Primeiro, você precisa de um ou mais modems que auto-respondam às chamadas. Seu modem precisa confirmar o “carrier detect” quando ele for detectado e não fazê-lo todo o tempo. Ele precisará desligar o telefone e resetar a si mesmo quando a linha DTR (Data Terminal Ready) alternar de ligado para desligado. Ele provavelmente deve utilizar o controle de fluxo RTS/CTS ou nenhum controle local de fluxo. Finalmente, ele deve utilizar uma velocidade constante entre o computador e si mesmo, mas (para ser simpático com seus usuários) ele deve negociar uma velocidade entre si mesmo e o modem remoto.

Para muitos modems compatíveis com o conjunto de comandos do Hayes este comando criará estas configurações e as armazenará na memória não volátil:

AT &C1 &D3 &K3 &Q6 S0=1 &W

Veja a seção enviando comandos AT abaixo para mais informações sobre como fazer estas configurações sem o auxílio de um programa de terminal MS-DOS.

Depois, faça uma entrada em /etc/ttys (veja ttys(5)) para o modem. Este arquivo lista todas as portas nas quais o sistema irá aguardar pelos logins. Adicione uma parecida com essa:

ttyd1 "/usr/libexec/getty std.57600" dialup on insecure

Esta linha indica que a segunda porta serial (/dev/ttyd1) tem um modem conectado e rodando a 57600 bps e sem paridade (std.57600, que vem do arquivo /etc/gettytab, veja gettytab(5)). O tipo de terminal para esta porta é dialup. A porta esta ligada e é insegura - quer dizer que o login do usuário root não é permitido. Para portas dialin como esta, utiliza-se a entrada ttydX

É uma prática comum utilizar dialup como o tipo do terminal. Muitos usuários configuram um prompt para seus arquivos .profile ou .login para o tipo de terminal existente se o tipo iniciante é dialup. O exemplo mostra a porta como insegura. Para tornar-se root nesta porta, você tem que logar-se como um usuário regular, e então su(1) para tornar-se root. Se você usar seguro, então o root vai poder efetuar o login diretamente.

Após efetuar as operações no /etc/ttys, você precisa enviar um sinal de hangup ou HUP para o processo init(8):

# kill -HUP 1

Esse comando forçará a releitura do arquivo /etc/ttys. O processo init iniciará os processos getty em todas as portas configuradas em on (ligadas). Você pode descobrir se seus logins estão disponíveis para sua porta digitando:

% ps -ax | grep '[t]tyd1'

Você deve ver algo como:

747 ??  I      0:00.04 /usr/libexec/getty std.57600 ttyd1

15.9. Como eu conecto um terminal burro ao meu FreeBSD?

Se você esta usando outro computador como um terminal de seu sistema FreeBSD, consiga um cabo “null modem” para ser usado entre as duas portas seriais. Se você esta utilizando um terminal próprio, veja as instruções que o acompanham.

Então, modifique o /etc/ttys (veja ttys(5)), como acima. Por exemplo, se você esta ligando um terminal WYSE 50 à quinta porta serial, utilize uma entrada como esta::

ttyd4 "/usr/libexec/getty std.38400" wyse50 on secure

Esse exemplo mostra que a porta em /dev/ttyd4 tem um terminal wyse50 conectado a 38400 bps (bits por segundo) sem nenhuma paridade (std.38400 de /etc/gettytab, veja gettytab(5))) e o login do root é permitido (seguro).

15.10. Por que eu não posso executar o tip ou o cu?

Em seu sistema, os programas tip(1) e cu(1) são provavelmente executáveis somente pro uucp e para o grupo dialer. Você pode utilizar o grupo dialer para controlar quem acessa o seu modem ou sistemas remotos. Basta adicionar você mesmo ao grupo dialer.

Alternativamente, você pode permitir a todos no seu sistema executarem o tip(1) e o cu(1) digitando:

# chmod 4511 /usr/bin/cu
# chmod 4511 /usr/bin/tip

15.11. Meu modem modelo Hayes não é suportado - o que eu posso fazer?

De fato a manpage para o tip(1) esta desatualizada. Há um discador generico do Hayes já incorporado. Apenas insira at=hayes em seu arquivo /etc/remote (veja remote(5)).

O drive do Hayes não é inteligente o bastante para reconhecer algumas das avançadas características dos modems mais novos - mensagens como BUSY, NO DIALTONE, ou CONNECT 115200 estarão apenas confundindo-o. Você deve desabilitar estas mensagens quando utilizar o tip(1) (com o comando ATX0&W).

Além disso, o timeout para discagem com o tip(1) é de 60 segundos. Seu modem deve utilizar um valor menor, senão o tip pensará que existe um problema de comunicação. Tente ATS7=45&W.

De fato, como o tip(1) não foi compilado para suportar HAYES, essa funcionalidade não é completamente suportada. A solução é editar o arquivo tipconf.h no diretório /usr/src/usr.bin/tip/tip. Obviamente você precisa da distribuição fonte para fazer isso.

Edite a linha #define HAYES 0 alterando-a para #define HAYES 1. Depois digite make e make install. Tudo funcionará bem depois disso.

15.12. Como posso entrar nestes comandos AT?

Faça o que é chamado de uma entrada “direta” no seu /etc/remote (veja remote(5)). Por exemplo, se o seu modem está definido na primeira porta serial, /dev/cuaa0, coloque a seguinte linha:

cuaa0:dv=/dev/cuaa0:br#19200:pa=none

Utilize a taxa de velocidade mais alta que seu modem suportar na capacidade br. Então digite tip cuaa0 (veja tip(1)) e você estará conectado ao seu modem.

Se não existir nenhum /dev/cuaa0 no sistema, faça isso:

# cd /dev
# sh MAKEDEV cuaa0

Ou utilize cu como root com o seguinte comando:

# cu -lline -sspeed

com a line sendo a porta serial (por exemplo, /dev/cuaa0) e speed sendo a velocidade (por exemplo, 57600). Quando terminar com os comandos AT, digite ~. para sair.

15.13. Porque o sinal <@> para a capacidade pn não funciona?

O sinal <@> no número de telefone diz ao tip para procurar em /etc/phones por um número de telefone. Mas o sinal <@> é também um caracter especial em arquivos como o /etc/remote. Escape dele com um \ (barra invertida):

pn=\@

15.14. Como eu posso discar um número de telefone pela linha de comando?

Coloque o que é chamado de uma entrada “genérica” no arquivo /etc/remote (veja remote(5)). Por exemplo:

tip115200|Disque para qualquer número em 115200 bps:\
        :dv=/dev/cuaa0:br#115200:at=hayes:pa=none:du:
tip57600|Disque para qualquer número em 57600 bps:\
        :dv=/dev/cuaa0:br#57600:at=hayes:pa=none:du:

Depois você pode fazer algo como tip -115200 5551234. Se preferir o cu(1) ao invés do tip(1), utilize uma entrada genérica:

cu115200|Use o cu para discar qualquer número em 115200bps:\
        :dv=/dev/cuaa1:br#57600:at=hayes:pa=none:du:

e digite cu 5551234 -s 115200.

15.15. Tenho que definir a taxa de bits por segundo sempre que fazer isso?

Coloque uma entrada para tip1200 ou para cu1200, mas vá em frente e utilize quaisquer taxas de bps (bits por segundo) que sejam apropriadas para a capacidade br. O tip(1) diz que um bom padrão é 1200 bps porquê ele procura uma entrada tip1200. De qualquer forma, você não precisa utilizar 1200 bps.

15.16. Como posso facilmente acessar vários hosts através de um terminal server?

Ao invés de esperar até a conexão, digitando CONNECT host sempre, use a opção cm do tip. Por exemplo, estas entradas em /etc/remote (veja remote(5)):

pain|pain.deep13.com|Forrester's machine:\
        :cm=CONNECT pain\n:tc=deep13:
muffin|muffin.deep13.com|Frank's machine:\
        :cm=CONNECT muffin\n:tc=deep13:
deep13:Gizmonics Institute terminal server:\
        :dv=/dev/cuaa2:br#38400:at=hayes:du:pa=none:pn=5551234:

permitirá a você digitar tip pain ou tip muffin para se conectar aos hosts pain ou muffin; e tip deep13 para se conectar ao terminal server.

15.17. O “tip” pode tentar discar mais de uma linha por vez?

Normalmente esse é um problema tradicional onde uma universidade possue várias linhas de modems e vários milhares de estudantes tentando usá-las...

Faça uma entrada para sua universidade em/etc/remote (veja remote(5)) e utilize a <\@> para a característica pn:

big-university:\
        :pn=\@:tc=dialout
dialout:\
        :dv=/dev/cuaa3:br#9600:at=courier:du:pa=none:

Então, liste os números de telefones para a universidade em /etc/phones (veja phones(5)):

big-university 5551111
big-university 5551112
big-university 5551113
big-university 5551114

O tip(1) tentará usar cada um na ordem listada, e depois desistirá. Se você quer manter-se tentando, execute o tip(1) em um loop while.

15.18. Por que eu tenho que pressionar duas vezes o CTRL+P para enviar CTRL+P uma única vez?

CTRL+P é o padrão para “force character”, utilizado para dizer ao tip(1) que o próximo caracter é um dado literal. Você pode definir o force character para qualquer outro caracter com o escape ~s, que quer dizer “defina uma variável”.

Digite ~sforce=single-char seguido de uma newline. single-charcaracter é qualquer caracter único. Se você deixar single-char, então o “force character” será o caracter nulo, que você pode ao digitar CTRL+2 ou CTRL+SPACE. Um valor muito bom para o single-char é SHIFT+CTRL+6, o qual eu vi sendo usado em alguns servidores de terminais.

Você pode ter o “force character” que você quiser especificando o seguinte em seu arquivo $HOME/.tiprc o seguinte:

force=single-char

15.19. Por que tudo o que eu digito inesperadamente está em CAIXA ALTA?

Você deve ter pressionado CTRL+A, o “raise character do tip(1)”, especialmente projetado para pessoas com teclas Caps Lock que não funcionam. Use o ~s como acima, e defina a variável “raisechar” para algo razoável. De fato, você pode definir isso para o force character também, se você nunca espera utilizar ambas as características.

Aqui está um exemplo de arquivo .tiprc perfeito para os usuários de Emacs que precisam digitar muitos CTRL+2 e CTRL+A:

force=^^
raisechar=^^

O ^^ é obtido com SHIFT+CTRL+6.

15.20. Como eu posso transferir arquivos com o tip?

Se você está conversando com outro sistema Unix, você pode enviar e receber arquivos com ~p (put) e com ~t (take). Estes comandos executam o cat(1) e o echo(1) no sistema remoto para aceitar e enviar arquivos. Sua sintaxe é:

~p <local-file> [<remote-file>]
~t <remote-file> [<local-file>]

Não há nenhuma checagem de erro, então você provavelmente deve usar um outro protocolo, como o zmodem

15.21. Como eu posso executar o zmodem com o tip?

Primeiro, instale um dos programas zmodem da coleção de ports (tais como lrzsz ou o rzsz).

Para receber arquivos, inicie o programa de envio no destino remoto. Então, pressione ENTER e digite ~C rz (ou ~C lrz caso tenha instalado o lrzsz) para iniciar o recebimento local

Para enviar arquivos, inicie o programa do lado remoto. Depois, aperte ENTER e digite ~C sz arquivos (ou ~C lsz arquivos) para envia-los ao sistema remoto.

15.22. O FreeBSD pode vir a não encontrar minhas portas seriais, mesmo quando as configurações estão corretas?

Sim, se sua placa-mãe for Acer UARTS. Elas não escaneiam corretamente o barramento serial, não permitindo que o FreeBSD encontre as Serial Input/Output (sio) da placa. O patch disponível em www.lemis.com pode corrigir esse problema.

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>.