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.