¿Cómo configuro mi sesión tty de modo que un carácter de avance de formulario `\f` borre la terminal?

¿Cómo configuro mi sesión tty de modo que un carácter de avance de formulario `\f` borre la terminal?

Me estoy conectando a una conexión serie USB en /dev/ttyACM0. El código del lado del remitente envía un \fcarácter a intervalos regulares.

    print("----------------------------\n\r");
    print("-- LED CONTROLLER 00.01   --\n\r");
    print("----------------------------\n\r");
    print("\n\f");

Sin embargo, cuando ejecuto cat /dev/ttyACM0desde la consola, la salida se desplaza hacia abajo en la pantalla en lugar de actualizarse en la parte superior.

Revisé la sttyconfiguración actual (escribiendo stty -F /dev/ttyACM0 -a) que arroja el siguiente resultado:

speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^A; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

La lectura de la stty --helppágina muestra el retraso en el avance del formulario ( ff0), pero no indica cómo cambiar nada más. También encontréesta páginalo que indica que puedo configurar el carácter FormFeed así FormFeed=014, pero esa sintaxis no funcionó para mi versión stty ( stty --versionda stty (GNU coreutils) 8.5).

Putty en Windows muestra el comportamiento correcto, pero estoy luchando para que esto funcione en Debian 6. ¿Alguien sabe cómo puedo configurar stty para interpretar un avance de formulario como una terminal clara?

Respuesta1

GNU sed no es esencial para resolver este problema (aunque el script es más fácil de leer). Un script mínimo es (probado con Solaris y OSX):

sed -e 's/^L/^[[H^[[J/g'

donde ^Ly ^[son los caracteres de control literales para el avance de formulario controlLy el escape control[. Puede insertarlos en un archivo usando vi(para insertar el carácter de escape, primero escriba controlV).

Las secuencias de escape se utilizan para

  • mueva el cursor a la posición inicial ^[[Hy
  • borrar la pantalla^[[J

Algunas notas:

  • no es necesario dar la fila y columna en el ^[[Hescape (y en cualquier caso, las posiciones empiezan por1, no0), y
  • si se borrara la pantallaantesAl mover el cursor, 2se necesitaría a en el escape, por ejemplo, ^[[2J, porque eso borra toda la pantalla. El valor predeterminado ^[[Jse borra desde la posición actual hasta el final de la pantalla. Por ejemplo, algunos terminales no estándar ansi.sysno hacían esa distinción.

Algunas personas se sienten confundidas por el uso que hace bash de ^Lcomo método abreviado de teclado para limpiar la pantalla, así como por la interpretación de PuTTY de ^L(ver¿Por qué la pantalla no se aclara cuando escribo control/L?en las preguntas frecuentes de XTerm).

Otras lecturas:

Respuesta2

Debe reemplazar el carácter de avance de página ( \f) con el adecuadoCódigos de escape ANSI.

Puedes hacer esto consed GNU:

sed 's/\f/\o33[2J\o33[0;0H/g' /dev/ttyACM0

En detalle: \033[2JBorrar pantalla, \033[0;0H: Ir a pos 0,0

(Si esto no funciona, inténtalo tail -f /dev/ttyACM0 | sed 's/\f/\o33[2J\o33[0;0H/g')

EDITAR: como@MarkReel comentó, puede utilizar para cadenas de escape ANSI de versiones no GNU (por ejemplo, BSD sed):

sed $'s/\f/\e[2J\e[0;0H/g' /dev/ttyACM0 

Respuesta3

Cuando su FPGA ejecuta, print("\n\f")en realidad está enviando dos bytes en su salida estándar, el primero es un salto de línea y el segundo es un salto de forma. Estos bytes son 0x0A y 0x0C.

Luego, la salida estándar se transfiere a través del cable USB y se lee a través de un dispositivo serie emulado. Este dispositivo serie simplemente transferirá ambos bytes al terminal de control (porque lo está leyendo mediante el catcomando) y, finalmente, a su terminal gnome, xterm o cualquier otro programa que esté utilizando. Este emulador de terminal debe comprender ambos bytes y actuar en consecuencia.

Entonces, debes verificar las capacidades de tu emulador. Cual estas usando?

Respuesta4

Dado que el problema es sobre la correcta emulación de un terminal ANSI, creo que la mejor opción que tienes es conectarte al conversor de serie a USB con minicom. Sólo recuerde abrir el dispositivo serie sin inicializar el módem, es decir, sin enviar comandos de Hayes al inicio.

información relacionada