Eco local usando a Tela para conectar a um terminal serial

7

Lendo o livro "Construindo redes de sensores sem fio" Aprendi que você pode usar o utilitário Screen para anexar a um console serial. Eu tentei usá-lo para se conectar a um módulo XBee e parecia funcionar bem, exceto por não ecoando os caracteres digitados localmente no terminal. A única coisa que eu encontrei até agora que parecia que poderia ajudar era usar o utilitário stty para definir a opção "echo" no dispositivo tty, mas a mudança não parece ter efeito. Eu corri stty no dispositivo tty e passei "eco". Se eu executar stty novamente para imprimir as opções atuais, ele ainda mostra que "-echo" está definido. Se meu entendimento da sintaxe estiver correto, o traço indica que a opção está desativada e nenhum traço significa que ela está ativada. Eu também tentei configurar a opção echo com sudo, mas isso também não fez diferença alguma.

Eu claramente não sou muito experiente nesta área, então qualquer ajuda seria muito apreciada.

    
por Pak 11.05.2014 / 05:42

1 resposta

5

Eu encontrei o mesmo problema tentando conectar-me a um dispositivo serial a 115200 bauds. Estou executando o RHEL V5.

uname -a

Dá:

Linux localhost.localdomain 2.6.32-100.0.19.el5 
#1 SMP Fri Sep 17 17:51:41 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

Depois de algumas escavações, encontrei isto:

sudo screen /dev/ttyS0 115200,cs8,-parenb,-cstopb,echo

ou isto:

sudo screen /dev/ttyS0 115200,cs8,-parenb,-cstopb,inlcr,onlret,echo

No entanto, como você apontou, quando o comando screen é executado, o atributo echo da porta serial selecionada (neste caso / dev / ttyS0) é revertido para

-echo  

Isso pode ser verificado pelo comando

sudo stty -F /dev/ttyS0 -a

Em uma janela de terminal separada.

Além disso, descobri que desanexar das sessões de tela usando

ctrl-A d

é uma má ideia porque não é possível anexar novamente. Vamos dar uma olhada em uma invocação típica ::

[iceman@localhost ~]$ sudo stty -F /dev/ttyS0 echo
[iceman@localhost ~]$ sudo screen /dev/ttyS0 115200,cs8,-parenb,-cstopb,echo
[detached]
[iceman@localhost ~]$ ps aux | grep SCREEN
root      3779  0.0  0.1  78476  2876 ?        Ss   11:05   0:00 SCREEN       /dev/ttyS0 115200,cs8,-parenb,-cstopb,echo
iceman    3781  0.0  0.0  61152   740 pts/6    S+   11:05   0:00 grep SCREEN
[iceman@localhost ~]$ screen -ls
No Sockets found in /var/run/screen/S-iceman.
[iceman@localhost ~]$ 

Portanto, a sessão de tela da qual nós nos desconectamos ainda está em execução, mas a tela -ls mostra o NADA. Enquanto a sessão de tela anexada a / dev / ttyS0 ainda estiver ativa, vamos dar uma olhada no estado do eco (que foi configurado como ativo acima). Se agora verificarmos o status de / dev / ttyS0, veremos que o eco foi desativado:

[iceman@localhost ~]$ sudo stty -F /dev/ttyS0 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 =  <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts -cdtrdsr
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
[iceman@localhost ~]$ 

e, finalmente, tentando outras alternativas para anexar novamente:

[iceman@localhost ~]$ screen -x
There is no screen to be attached.
[iceman@localhost ~]$ screen -r
There is no screen to be resumed.
[iceman@localhost ~]$ 

Esta pode ser a fonte de muito tempo desperdiçado, pois uma pesquisa de processo por "tela" minúscula não resultará em nada!

IMPORTANTE: Se houver várias sessões de tela na mesma porta serial, as tentativas de determinar o que está acontecendo terão resultados aleatórios, dependendo de qual processo "captura" a interrupção da porta serial.

Como você disse, a opção echo na tela, por qualquer motivo, não está sendo passada para stty e, de fato, independentemente de você usar -echo ou echo, stty define -echo quando chamado pela tela usando / dev / ttyS0 como a porta serial especificada. (Eu confirmei isso)

Eu encontrei uma solução usando minicom da seguinte forma:

sudo minicom -s

Em seguida, configure a porta serial no menu da porta serial da seguinte forma:

A -    Serial Device      : /dev/ttyS0
B - Lockfile Location     : /var/lock
C -   Callin Program      : 
D -  Callout Program      :  
E -    Bps/Par/Bits       : 115200 8N1
F - Hardware Flow Control : No 
G - Software Flow Control : No

Em seguida, salve como "ser1" e use o comando:

sudo minicom ser1

Isso iniciará o minicom, que você poderá usar:

ctrl-A E

para ativar o eco local e

ctrl-A A

para acrescentar um avanço de linha a ascii com terminação CR chegando à porta serial.

Minicom reporta sua versão como:

Welcome to minicom 2.1  

OPTIONS: History Buffer, F-key Macros, Search History Buffer, I18n      
Compiled on Jun  6 2007, 06:02:15.

Espero que isso ajude e poupe pelo menos uma outra pessoa de algum tempo e esforço. Quem teria pensado que configurar o equivalente do HyperTerm no Linux seria tão doloroso?

    
por 13.09.2015 / 19:48