Como enviar dados para uma porta serial e ver alguma resposta?

31

No Linux, quero enviar uma cadeia de comando (ou seja, alguns dados) para uma porta serial (contendo caracteres de controle) e ouvir a resposta (que geralmente também pode conter caracteres de controle).

Como posso fazer isso da forma mais simples possível no Linux? Um exemplo é apreciado!

    
por Alex 26.02.2014 / 13:22

5 respostas

44

Todos os dispositivos no Unix são mapeados para um arquivo de dispositivo, as portas seriais seriam /dev/ttyS0 /dev/ttyS1 ....

Primeiro, dê uma olhada nas permissões desse arquivo, vamos supor que você esteja usando /dev/ttyS1 .

ls -l /dev/ttyS1

Você vai querer o acesso read.write, se este for um sistema compartilhado, então você deve considerar as conseqüências de segurança de abri-lo para todos.

chmod o+rw /dev/ttyS1

Um método bruto muito simples para escrever no arquivo, usaria o comando simples echo .

echo -ne '3[2J' > /dev/ttyS1

e para ler

cat -v < /dev/ttyS1

Você pode ter o gato funcionando em um terminal e fazer eco em um segundo.

Se tudo for sem sentido, então a taxa de transmissão, as configurações de bits podem precisar ser definidas antes de você começar a enviar. stty fará isso. !! NOTA stty irá usar stdin como descritor de arquivo padrão para afetar.

Comandos equivalentes.

stty -speed 19200 < /dev/ttyS1
stty -speed 19200 -f /dev/ttyS1

Isso pode ser o suficiente para você escrever algo e logar? Não tenho certeza do que você está tentando alcançar.

Para uma abordagem mais interativa, lembre-se de suas configurações padrão seria usar minicom é apenas um programa que faz tudo o que mencionei até agora. (semelhante ao hyperterminal no Windows, você pode estar familiarizado).

Uma solução intermediária usaria um programa terminal como screen , que funcionará em um dispositivo serial.

screen /dev/ttyS1

man screen man minicom man stty para mais informações

    
por 26.02.2014 / 15:33
6

Tudo o que você precisa fazer é abrir dois terminais. No primeiro terminal você cat tudo do dispositivo, por exemplo

cat /dev/ttyS0

no outro terminal, você pode enviar caracteres hexadecimais arbitrários e texto para o terminal, e. da seguinte forma:

echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0

O comando echo -e permite a interpretação de escapes de barra invertida.

É necessário garantir que (i) as configurações de série (velocidade, comprimento de palavra, fluxo ctrl, etc) estão corretas e (ii) o dispositivo serial (na outra extremidade) não está bloqueando.

    
por 26.02.2014 / 15:43
4

Programas que falam com dispositivos seriais:

picocom
minicom
socat

ou a partir do shell, você pode fazer:

stty -speed 19200 < /dev/ttyS0 # sets the speed of the port
exec 99<>/dev/ttyS0 (or /dev/ttyUSB0...etc)
printf "AT\r" >&99
read answer <&99  # this reads just a CR
read answer <&99  # this reads the answer OK
exec 99<>&-
    
por 27.12.2016 / 13:03
3

Esta poderia ser uma abordagem melhor:

stty -F /dev/ttyUSB0 115200 raw -echo   #CONFIGURE SERIAL PORT
exec 3</dev/ttyUSB0                     #REDIRECT SERIAL OUTPUT TO FD 3
  cat <&3 > /tmp/ttyDump.dat &          #REDIRECT SERIAL OUTPUT TO FILE
  PID=$!                                #SAVE PID TO KILL CAT
    echo "R" > /dev/ttyUSB0             #SEND COMMAND STRING TO SERIAL PORT
    sleep 0.2s                          #WAIT FOR RESPONSE
  kill $PID                             #KILL CAT PROCESS
exec 3<&-                               #FREE FD 3
cat /tmp/ttyDump.dat                    #DUMP CAPTURED DATA
    
por 20.06.2017 / 01:27
2

Você pode ler e gravar em um dispositivo simultaneamente assim:

cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411

Sua mensagem é enviada para o segundo cat de stdin e o primeiro cat retransmite a resposta para stdout , transformando seu terminal em uma sala de bate-papo.

Para finalizar, ctrl-c , execute fg then ctrl-c novamente.

    
por 14.12.2016 / 18:09