O cat é o único comando confiável que pode ler dados de serial?

1

Eu tenho uma escala que envia continuamente dados via porta serial, 2 vezes por segundo. A única maneira confiável de ler esses dados era o comando cat . Os seguintes trabalhos:

cat /dev/ttyUSB0

Mas o problema com cat é que, como ele não recebe um EOF , ele continua recuperando dados. Eu também tentei head , read e tail .

head -1 /dev/ttyUSB0 | strings

funciona quase toda vez, mas de vez em quando mostra dados antigos, e somente o comando re-running cat corrige (?). A string após o pipe recupera apenas dados imprimíveis.

read line < /dev/ttyUSB0 | echo $line

agora recupera dados, mas na maioria das vezes mostra apenas uma linha vazia.

tail -1 < /dev/ttyUSB0

apenas congela, esperando por EOF , talvez?

Meu problema é que preciso escrever um script bash que possa ser chamado e "lido" /dev/ttyUSB0 e recuperar dados. Eu vou usar head . Mas eu estou querendo saber, como cat nunca falha, se há uma maneira de capturar apenas uma linha de cat output e depois pará-lo.

Nota: a configuração da porta é de 9600 bauds, 1 bit de início, 8 bits de dados, sem paridade, 2 bits de parada. Para definir a porta corretamente, este é o comando:

sudo stty -F /dev/ttyUSB0 9600 -parity cs8 cstopb
    
por thejavo 12.07.2017 / 18:14

1 resposta

0

Sua melhor aposta é colocar o tty no modo raw e escrever um programa que descarta os caracteres até ver o início de uma mensagem e, em seguida, imprimir os caracteres até chegar ao final de uma mensagem. Com 'raw' adicionado ao stty , fgetc() pode ser usado no tty para obter um único caractere.

fora do punho psuedo:

char = fgetc(serial_port);
if char == START_CHARACTER {
    putc(char);
    for (i=0;i<MESSAGE_LENGTH;i++){
        putc(fgetc(serial_port));
    }
}

Também pode ser possível fazer isso com sed e um raw tty, veja essa outra pergunta: link

    
por 12.07.2017 / 22:40