Conecte-se à serial, emita um comando, leia o resultado, capture-o e saia

1

Eu tenho algum dispositivo conectado à porta serial. Na verdade, é um sensor de temperatura baseado em Arduino .

Eu gostaria de escrever um script, que irá se conectar à porta serial, enviar um comando ao dispositivo, receber sua resposta, imprimi-lo em stdout e sair.

Qual é a maneira correta de fazer isso?

Normalmente, ao acessar o programa local, não há problema em redirecionar sua saída. Por exemplo, é assim que eu leio CPU temperature.

datetime=$(date +%Y%m%d%H%M%S)
cputemp=$(sensors atk0110-acpi-0 | sed "s/CPU Temperature:[^0-9]*\([0-9\.]\+\).*//;tx;d;:x")
echo "$datetime\t$cputemp"

Infelizmente, $() depende do fim do programa explícito, o que não é o caso da comunicação serial. Servidor serial sempre on-line e sem "sessões" explícitas.

Claro, posso verificar os feeds de linha. Mas esta ação correta? Pode ser que eu deva escrever meu programa Arduino para que ele envie Ctrl-Z após cada resposta ou algo assim?

    
por Dims 25.09.2015 / 10:12

1 resposta

2

Como você disse, não é possível ler o fim do arquivo de uma porta serial. (Ctrl-Z é uma coisa do microsoft). Então, normalmente, você lê até ter o número desejado de caracteres, ou até encontrar um delimitador como nova linha que sinaliza o fim dos dados.

Por exemplo, eu tenho uma porta serial usb com saída conectada de volta à entrada, então qualquer gravação no dispositivo simplesmente volta diretamente. O script a seguir pode recuperar o que o dispositivo envia:

#!/bin/bash
tty=/dev/ttyUSB0
exec 4<$tty 5>$tty
stty -F $tty 9600 -echo
echo abcdef >&5
read reply <&4
echo "reply is $reply"

O script conecta o dispositivo serial como descritor de arquivo 4 para entrada, 5 para saída, define a velocidade e pára o eco que você recebe por um tty, em seguida, escreve "abcdef" e nova linha para o dispositivo. Cada caractere será enviado de volta imediatamente, mas o driver do kernel armazenará alguma entrada, então eu não preciso começar para ler a partir do dispositivo antes de fazer a gravação. A leitura termina por padrão quando vê uma nova linha e salva-a na variável reply , que é então ecoada para stdout. Você pode colocar esse script dentro de um uso do tipo v=$() .

Se os dados do seu dispositivo serial não terminarem com uma nova linha, você poderá especificar um delimitador diferente para a leitura do bash com -d . Ou se a resposta é de uma constante comprimento, você pode especificar um comprimento com -n . Se você tiver dados binários, provavelmente deve adicionar raw ao comando stty para interromper qualquer tratamento especial de entrada.

    
por 26.09.2015 / 10:50