¿Es posible enviar caracteres a través de la serie para subir una línea en la ventana de la consola?

7

Creo que es posible debido a cómo puedo ejecutar vi directamente desde mi puerto serie a través de TeraTerm. Allí, puedo editar un texto, ir a la siguiente línea, luego regresar y editar la primera línea! ¿Cómo hacen esto?

¿Qué personaje sobre UART podría enviar para "subir una línea"?

EDITAR: Aparentemente, el avance de línea funciona. "\ f" para borrar la pantalla. Sin embargo, esto solo funciona para Hyperterminal en mi máquina y no en Teraterm. Alguien sabe por qué?

    
pregunta cksa361

3 respuestas

11

Use códigos de escape VT100 para controlar el cursor.

Por ejemplo.

puts("3[2J");   // clear screen
puts("3[0;0H"); // set cursor to 0,0
puts("3[10B");  // move cursor down 10 lines
puts("3[5A");  // move cursor up 5 lines
    
respondido por el Toby Jaffey
3

Lo que ve en una ventana de la consola es el resultado de un eco automático (que a menudo se puede activar o desactivar), donde el programa de la consola dibuja los caracteres que envía en la pantalla, o el resultado de recibir caracteres. Esto significa que hay dos formas de cambiarlo:

  1. Tenga un programa local, en la PC, vuelva a dibujar la pantalla.
  2. Haga que el dispositivo conectado vuelva a dibujar la pantalla.

Hay muchas maneras de hacer esto, pero así es como me acercaría a una implementación de pasatiempo simplista:

  • Establezca un ancho de línea predeterminado, como 80, y un número de filas, como 24. Desactive el eco automático.
  • Unapantallade80x24significa1920caracterespor'frame',loquesignificaque,sieldispositivoconectadoestáhaciendoeltrabajo,unatasadeactualizaciónmáximadealrededorde1920/BAUDRATE/11oaproximadamente5Hza115200baudios(usando1bitdeinicio,1parada,1paridad,8datos).
  • Asignelasteclasdeflechaa caracteres o cadenas específicos . Esto ya se puede hacer detrás de las escenas. (Para la Terminal OSX, izquierda : 3[5D ; derecha : 3[5C ; arriba & abajo indefinido por defecto.)
  • Programe el dispositivo conectado para que reconozca estos caracteres y / o cadenas, y mueva la referencia del cursor en consecuencia.
  • Salida a través de la línea serie no por carácter o matriz de caracteres, sino por marco. Específicamente, mantenga dos matrices de caracteres de 1921 (1920 + terminador): una para escribir mientras se transmite la otra (asumiendo el uso de hardware UART e interrupciones).
  • La escritura en el buffer de cuadros se puede lograr usando una función como esta:
    uint8_t framewrite(const char *s, uint8_t row, uint8_t col)
    ... Donde *s es su matriz de caracteres [terminada], y row y col es donde desea que aparezca el primer carácter. (La devolución uint8_t es para la captura de errores).
  • Probablemente querrá funciones como uint8_t frame_clear(void) , uint8_t frame_shiftrowsdown(void) , etc.
  • Para indicar la posición del cursor, puede alternar el carácter actual y un cuadro negro o el carácter que elija ( pblinkchar ), usando framewrite(pblinkchar,cursor_row,cursor_col) .
  • Se puede usar el mismo método para devolver los caracteres a la posición del cursor.

Estoy seguro de que hay formas mucho más simples (creo que los de software lo llaman "elegante") de hacer esto mediante la programación de una ventana de PC, y probablemente puedas descubrir cómo cavando a través de thou tutorial , pero lo anterior es similar a lo que he hecho en el pasado y funciona para interfaces de usuario simples con micros con mucha memoria de repuesto.

    
respondido por el tyblu
1

Esta es una respuesta indirecta a tu pregunta. Si estás en VI, todo lo que necesitas hacer para mover el cursor es enviar 'k'.

Viendo esta página de comandos de VT100 , parece que la tecla de flecha arriba está representada por enviando la siguiente secuencia: ESC [ A o 0x1B, 0x5B, 0x41 . No sé si esto funcionará, pero estoy interesado en saber si lo hace.

    
respondido por el W5VO

Lea otras preguntas en las etiquetas