Puerto serie loopback / prueba dúplex, en Bash o C? (sustitución del proceso)

Tengo un dispositivo serie configurado como loopback (lo que significa que simplemente hará eco de cualquier carácter que reciba), y me gustaría medir la velocidad de rendimiento efectiva. Para esto, esperaba poder usartime, como en

time bash -c '...'

dónde '...'sería un comando que podría ejecutar.

Ahora, el primer problema es que quiero usar el dispositivo a 2000000 bps, por lo que no puedo usarttylog opantalla (ambos parecen subir hasta 115200 bps solamente). Sin embargo, trabajando con/dev/ttyUSB0 como un archivo (usando la redirección de archivos ycat) parece funcionar bien:

# initialize serial port
stty 2000000 -ixon icanon </dev/ttyUSB0

# check settings
stty -a -F /dev/ttyUSB0

# in one terminal - read from serial port
while (true) do cat -A /dev/ttyUSB0 ; done

# in other terminal - write to serial port
echo "1234567890" > /dev/ttyUSB0

# back to first terminal, I now have:
# $ while (true) do cat -A /dev/ttyUSB0 ; done
# 1234567890$
# ...

Ahora, me gustaría hacer algo similar, me gustaríacat un archivo a un puerto serie y hacer que el puerto serie se lea de nuevo, pero desde un solo comando de terminal (por lo que podría usarlo como argumento paratime)

Pensé que podría usar una sustitución del proceso Bash, para que la parte de "escritura" y "lectura" vaya, más o menos, en "paralelo"; si lo intento con tuberías con nombre, funciona:

# mkfifo my.pipe # same as below:
$ mknod my.pipe p

$ comm <(echo -e "test\ntest\ntest\n" > my.pipe) <(cat my.pipe)
    test
    test
    test
comm: file 2 is not in sorted order

Allá arriba, no estoy usandocomm para cualquier otro propósito, que no sea (más o menos) fusionar los dos procesos en un solo comando (supongo, podría haber utilizadoecho en lugar).

Desafortunadamente, ese truco no parece funcionar con un puerto serie, porque cuando lo intento, a veces obtengo:

$ comm <(echo "1234567890" > /dev/ttyUSB0) <(while (true) do cat -A /dev/ttyUSB0 ; done)
cat: /dev/ttyUSB0: Invalid argument

..., sin embargo, generalmente no obtengo ningún tipo de salida. Esto me dice que: o bien no hay control sobre qué proceso comienza primero, y entoncescat puede comenzar a leer antes de que el puerto esté listo (sin embargo, eso no parece ser un problema en el primer ejemplo anterior); o en Linux / Bash, no puede leer y escribir en un puerto serie al mismo tiempo, por lo que el "Invalid argument"ocurriría en esos momentos en que tanto la lectura como la escritura parecen suceder al mismo tiempo.

Entonces mis preguntas son:

¿Hay alguna manera de hacer algo como esto (cat un archivo a un puerto serie configurado como loopback; léelo y vea cuánto tiempo lleva) solo en Bash, sin recurrir a escribir un programa dedicado de C?Si necesito un programa de C dedicado, ¿podría usar algún ejemplo de fuente en la red?

Muchas gracias por cualquier respuesta,

¡Salud!

 

EDITAR: Soy consciente de que elwhile el bucle escrito arriba no sale; esa línea de comando fue para pruebas preliminares, y la interrumpí usando Ctrl-C. (En principio, podría interrumpirlo con algo comotimeout -9 0.1 bash -c 'while (true) do echo AA ; done', pero eso anularía el propósito detime, luego :) )

La razón quewhile está ahí, es que por el momento, leyendo a través decat desde el dispositivo sale inmediatamente; a veces, yotener configurar el dispositivo, de modo que cuandocat se emite, de hecho bloquea y espera los datos entrantes; pero todavía no puedo entender qué está pasando (y en parte es por eso que estoy buscando una forma de probar desde la línea de comandos).

En caso de que no use elwhile, Me imagino que para el momento, usaría algo como:

time bash -c 'comm <(echo "1234567890" > /dev/ttyUSB0) <(cat -A /dev/ttyUSB0)'

... sin embargo, para que esto funcione, más o menos, se supone quecat -A /dev/ttyUSB0 comienza primero y bloquea; entonces laecho escribe en el puerto serie (y sale); y entoncescat -A emite todo lo que lee del puerto serie y luego sale. (Y tampoco estoy seguro de si un puerto serie puede comportarse de esta manera, ni sicat se puede hacer que bloquee y salga arbitrariamente así)

El método exacto realmente no importa; si es posible, me gustaría evitar codificar mi propio programa C para hacer este tipo de pruebas, por lo que mi interés principal es si de alguna manera es posible ejecutar una "prueba dúplex completa" utilizando Bash básico / Linux (es decircoreutils); (y si no, si hay un código listo que puedo usar para algo como esto)

EDIT2: También posiblemente relevante:

Procesos paralelos en Bash - foros de Ubuntu

Respuestas a la pregunta(2)

Su respuesta a la pregunta