Extraer caracteres de un puerto serie

Extraer caracteres de un puerto serie

Tengo una pregunta tonta para usted: estoy intentando extraer algunas líneas de un archivo que comienza con una cadena especial de caracteres y copiarlas en un archivo. Lo intenté :

cat /dev/ttyACM0 | grep "something" > essai

¡El archivo se crea pero no contiene nada!

Respuesta1

Para mayor eficiencia, utilice grep y muchos otros comandosE/S almacenadas en búfer, es decir, leen grandes bloques de datos a la vez (en lugar de, digamos, un carácter a la vez) y no generan datos hasta que se ha acumulado una cierta cantidad (en lugar de, digamos, escribir una línea a la vez o un personaje a la vez)

Pero, cuando la entrada de un programa proviene de una terminal (como su puerto serie), el sistema operativo le hace un favor al programa y devuelve una línea a la vez (el programa puede cambiar esto poniendo la terminal encrudoomodo no canónico; la mayoría no lo hace).

Y cuando un programa utiliza elstdiobiblioteca, la salida estándar a una terminal (la documentación lo llama "dispositivo interactivo") está, de forma predeterminada, almacenada en búfer de línea, pero la salida a un archivo o canalización está completamente almacenada en búfer.

Un programa que utiliza la biblioteca stdio puede elegir almacenamiento en búfer completo, almacenamiento en búfer de línea o sin almacenamiento en búfer llamandosetvbuf. También puede llamarfflushpara forzar una escritura cuando lo desee.

GNU grep toma un--line-bufferedopción, que ejecutará elsiguiente códigoen la función que genera una línea coincidente:

if (line_buffered)
  fflush (stdout);

Juntando todas las piezas:

Con este comando:

cat /dev/ttyACM0 | grep "something" > essai

catleerá una línea a la vez desde /dev/ttyACM0. Después de haber acumulado unos pocos kilobytes de salida, escribirá en la tubería. Repetirá esto hasta que la lectura devuelva un recuento de cero o falle (lo que probablemente no sucederá hasta que el puerto serie se desconecte).

grepleerá unos pocos kilobytes a la vez desde la tubería y, después de haber acumulado unos pocos kilobytes de salida, escribirá en el essaiarchivo. Repetirá esto hasta que la lectura devuelva un recuento de cero o falle, lo que sucederá si el catproceso sale.

Por lo tanto, no verá aparecer nada en el essaiarchivo hasta que grephaya encontrado unos pocos kilobytes de líneas coincidentes.

Para que el resultado se escriba en el archivo más rápidamente, puede darle a GNU grep esa opción:

grep --line-buffered < /dev/ttyACM0 > essai

Dado que se lee desde un puerto serie, se almacenará en búfer de línea y la --line-bufferedopción hará que la línea de salida también se almacene en búfer.

información relacionada