cat corrompe dados da porta serial

4

Eu tenho um aplicativo que grava alguns bytes em uma porta serial. Quando eu faço cat /dev/ttyS0 para ver o que está sendo transferido, descubro que os dados estão corrompidos pelo comando cat . Existe alguma outra maneira de ver o que está sendo enviado na porta serial?

Alguém sabe por que cat altera os dados?

Editar : há outro aplicativo no outro lado e quero interceptar os dados para verificar seu conteúdo, mas o aplicativo deve continuar funcionando.

    
por Ricardo Cristian Ramirez 23.09.2012 / 00:05

3 respostas

4

Não está corrompido. O que está acontecendo é que o comando cat está obtendo alguns dos bytes e seu aplicativo está obtendo alguns deles. Portanto, quando você executar cat , todos os bytes lidos por ele serão perdidos pelo aplicativo, e ambos cat e o aplicativo verão fluxos (parciais) parciais que aparecem corrompidos.

    
por 23.09.2012 / 07:39
9

Tem certeza de que os dados não estão corrompidos pelo seu terminal (ou onde quer que o gato esteja exibindo)? Não é provável que cat corrompa seus dados.

Tente usar od (octal dump) para despejar os dados vindos da porta serial, para que você possa ver exatamente o que está aparecendo (sem depender de que seja imprimível). Use od -c se você estiver esperando dados ASCII.

Se você ainda está vendo corrupção, talvez sua porta serial não esteja configurada corretamente? Experimente setserial e stty para ver se eles podem configurar melhor as coisas.

    
por 23.09.2012 / 00:16
6

cat não modifica os dados. Pode haver sistemas Unix antigos onde trunque linhas que contenham bytes nulos, mas não o Linux, e eu acho que não existe nenhum sistema moderno semelhante a um unix.

Por outro lado, se você tentar exibir dados binários diretamente em seu terminal, o terminal interpretará caracteres de controle como comandos para controlar a exibição. É para isso que servem os personagens de controle. Se você quiser ver uma representação imprimível dos dados brutos, terá várias soluções:

  • Execute cat -A , que imprimirá uma representação legível, mas ambígua, dos caracteres de controle (por exemplo, ^A pode ser o byte 0x01 ou a sequência de dois bytes 0x5e 0x41).
  • Execute hexdump -C , od -t x1 ou algum outro programa de despejo hexadecimal (ou um dump octal, se preferir).
  • Execute less /dev/ttyS0 e pressione F para ler alguns dados, em seguida, Ctrl+C para procurá-lo. Dentro de menos, digite -r para alternar entre exibição bruta de caracteres de controle e uma representação imprimível.

Observe que a leitura de /dev/ttyS0 mostra o que a porta serial recebe, não o que é enviado por ela. Se você quiser, espionar o aplicativo que está sendo escrito, por exemplo, com strace ou depurador.

    
por 23.09.2012 / 04:11