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


37

No Linux, desejo enviar uma sequência de comandos (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 maneira mais simples possível no Linux? Um exemplo é apreciado!


você deve olhar para este unix.stackexchange.com/a/116705/53092
Kiwy

Não tenho interceptação instalada.
26414 Alex

1
nomear para reabertura - não é uma duplicata, conforme sugerido.
Peterph

algumas pessoas são muito estúpidas, apenas sugerem perguntas como publicadas. Primeiro, leia as perguntas e responda.
Denis

Respostas:


54

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ê desejará acesso read.write, se este for um sistema compartilhado, considere as conseqüências de segurança de abri-lo para todos.

chmod o+rw /dev/ttyS1

Um método bruto muito simples de gravar no arquivo usaria o echocomando simple .

echo -ne '\033[2J' > /dev/ttyS1

e ler

cat -v < /dev/ttyS1

Você pode ter um gato correndo em um terminal e ecoar em um segundo.

Se tudo estiver sem sentido, então a taxa de transmissão, as configurações de bits podem precisar de configuração antes de você começar a enviar. sttyvai fazer isso. !! OBSERVAÇÃO stty usará stdin como descritor de arquivo padrão para afetar.

Comandos equivalentes.

stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1

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

Para um mais interativo, lembra que sua abordagem de configurações padrão seria usá- minicomlo, é apenas um programa que faz tudo o que mencionei até agora. (semelhante ao hiperterminal no Windows, você pode estar familiarizado).

Uma solução intermediária usaria um programa de terminal como o screenque funcionará em um dispositivo serial.

screen /dev/ttyS1

man screen man minicom man stty Para maiores informações


Não estou conseguindo nenhuma saída. Tem alguma ideia?
Goldname 10/11/18

Possivelmente, o controle de fluxo de hardware, desligue com o comando atty ou prenda com um cabo serial alto, procure um cabo modem nulo.
X Tian

1
# stty -speed 38400 -f /dev/ttyUSB1retornastty: invalid argument '-speed'
Pro Backup

1
em stty é -F (maiúscula F) para configurar o dispositivo. Seu parâmetro de velocidade também está errado. Você pode usar a velocidade para obter a taxa de transmissão da porta ou ispeed ou ospeed (sem o sinal de menos) para definir as velocidades de entrada e saída, ou apenas um número para definir as velocidades de entrada e saída, como: stty 19200 -F / dev / ttyS ....
Paulus

Incrível, ninguém notou isso antes, obrigado @Pro Backup Eu corrigi o exemplo.
X Tian

11

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

cat /dev/ttyS0

no outro terminal, você pode enviar caracteres hexadecimais e texto arbitrários para o terminal, como por exemplo:

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

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

É preciso ter certeza de que (i) as configurações seriais (velocidade, comprimento das palavras, fluxo ctrl etc.) estão corretas e (ii) o dispositivo serial (na outra extremidade) não está bloqueando.


Você respondeu 10 minutos depois que eu escrevi minha resposta acima e você não adicionou mais nenhuma informação!
X Tian

Oh, desculpe, eu não li sua resposta completamente. Vi que minha resposta está incluída na sua, então aceitarei sua resposta como a correta, pois você descreveu exatamente o que eu descrevi.
26414 Alex

Não sei muito sobre portas COM. Você poderia explicar o que "o dispositivo serial (do outro lado) não está bloqueando" significa? Algum problema com o firewall?
Sopalajo de Arrierez 13/09/2015

9

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

a sua é uma resposta incrível que me ensinou sobre descritores de arquivos bidirecionais. No entanto, você tem certeza de que a sintaxe da última linha para fechar o descritor está correta? Eu recebo erro de sintaxe. Eu acho que um exec 99<&-ou exec 99>&-deveria ser usado. Ou possivelmente os dois?
Yankee

1
erro de digitação .. você está certo
Zibri 24/06

7

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
  wait $PID 2>/dev/null                 #SUPRESS "Terminated" output

exec 3<&-                               #FREE FD 3
cat /tmp/ttyDump.dat                    #DUMP CAPTURED DATA

Isso é muito bom porque automatiza o processo! A única alteração que eu faria, que é totalmente opcional, é confirmar que o conteúdo recebido é o mesmo que o enviado - poderia ser apenas uma contagem ou total no diff.
HiDefLoLife

4

Você pode ler e gravar em um dispositivo simultaneamente:

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

Sua mensagem é enviada para o segundo cata partir stdin, e os primeiros catrelés a resposta a stdout, transformando o seu terminal em uma sala de chat.

Para terminar, ctrl-ce depois executar fg, em seguida, ctrl-cnovamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.