tentando colocar dados de entrada dinâmicos em uma variável via método cat

2

Eu estou tentando escrever um script bash que deve ser capaz de coletar dados de ttyS0 e colocar em uma variável.

Eu preciso falar com um dispositivo na linha serial, que é um módulo capaz de receber comandos AT que eu posso enviar com echo > ttyS0 e captura a resposta relacionada em uma variável. É possível fazer isso sem armazenar a resposta recebida em uma variável (ou seja, cat / dev / ttyS0 & ), mas se eu tentar colocar esses dados em uma variável (ou seja, VAR = $ (cat / dev / ttyS0 &) não funciona (em VAR não consigo encontrar nada após a resposta do módulo).

O que eu sou capaz de fazer "manualmente" através de terminais gnome (estou trabalhando com uma distribuição do Ubuntu) é o seguinte:

  1. De um terminal do GNOME que eu chamo (A), eu corro (como root)

    # VAR=$(cat /dev/ttyS0) 
    

    Este comando não retorna o prompt root # , porque provavelmente cat /dev/ttyS0 está sendo executado e aguardando entrada.

  2. De outro terminal do GNOME que eu chamo (B), eu corro

    # echo -en "hello in VAR\r" > /dev/ttyS0 
    

    A string hello in VAR deve ir para /dev/ttyS0 e colocar por cat em VAR

  3. Depois de (B):

    # killall cat
    

    Do terminal GNOME (A), vejo que o prompt ( # ) retorna;

  4. Finalmente, a partir do terminal GNOME (A):

    # echo "$VAR" 
    

    e eu recebo a string hello in VAR .

Eu tentei implementar isso via script bash desta maneira:

#!/bin/bash

killall cat

BASHTESTS_DIR=/root/Desktop/Tips_tricks_tutorials/bash_scripting
cd $BASHTESTS_DIR

echo "before VARcat_dev_ttyS0"
VAR=$(cat /dev/ttyS0)
echo "after VARcat_dev_ttyS0"
echo -en "hello in VAR\r" > /dev/ttyS0 
sleep 2
killall cat 
echo "content of VAR: $VAR"

exit 0

mas o script para depois de echo "before VARcat_dev_ttyS0" Como posso implementar o que quero ou o que posso fazer com dois terminais GNOME?

    
por lucat 27.02.2015 / 14:52

1 resposta

3

Parece que você está tentando usar ttyS0 como meio de conectar dois processos. Isso não funcionará de forma confiável, pois ttyS0 é a interface para uma linha serial ( COM1: no Windows-speak).

Por outro lado, pode ser que a informação esteja faltando na sua pergunta. Se você realmente tem um dispositivo em sua porta serial, por favor deixe isso claro.

O que eu acredito que você está procurando é um cachimbo. No sistema de arquivos, isso se parece muito com um arquivo, mas permite que dados gravados em um lado sejam lidos de outro. É o que está por trás dos bastidores do onipresente operador | , como em, e. id | nl .

Você pode criar um canal com o comando mkfifo ou mknod p se você insistir.

Terminal nº 1

mkfifo /tmp/pipe        # Create the pipe
ls -l /tmp/pipe         # Notice the first character is 'p'

echo hello > /tmp/pipe  # Write to it
rm -f /tmp/pipe         # Remove the pipe

Terminal nº 2

cat /tmp/pipe           # Read from the other side of the pipe

Você pode estender o código do Terminal 2 como este. Lembre-se, no entanto, que para cada nova leitura (na verdade aberta / lida / fechada) no tubo você precisa fornecer dados novos.

read VAR </tmp/pipe    # Read one line from the pipe
VAR=(cat /tmp/pipe)    # Read from the pipe until EOF
    
por 27.02.2015 / 15:23