Como eu configuro minha sessão tty de modo que um caractere de feed de formulário '\ f' limpe o terminal?

3

Estou conectando a uma conexão USB-serial em / dev / ttyACM0. O código no lado do remetente está enviando um caractere \f em intervalos regulares.

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

No entanto, quando executo cat /dev/ttyACM0 do console, a saída rola pela minha tela em vez de ser atualizada na parte superior.

Eu examinei as configurações atuais de stty (digitando stty -F /dev/ttyACM0 -a ), que fornece a seguinte saída:

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

A leitura da página stty --help fornece o atraso do feed do formulário ( ff0 ), mas não indica como alterar qualquer outra coisa. Também encontrei esta página que indica que posso definir o caractere FormFeed assim FormFeed=014 , mas essa sintaxe não funcionou para minha versão stty ( stty --versionstty (GNU coreutils) 8.5 ).

Putty no Windows exibe o comportamento correto, mas eu estou com dificuldades para fazer isso funcionar no Debian 6. Alguém sabe como eu posso configurar o stty para interpretar um feed de formulário como um terminal limpo?

    
por stanri 30.04.2013 / 09:20

5 respostas

2

Você precisa substituir o caractere de feed de formulário ( \f ) pelos códigos ANSI Escape adequados. .

Você pode fazer isso com o GNU sed :

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

Em detalhes: 3[2J Limpar tela, 3[0;0H : Ir para pos 0,0

(Se isso não funcionar, tente tail -f /dev/ttyACM0 | sed 's/\f/\o33[2J\o33[0;0H/g' )

    
por 30.04.2013 / 18:40
1

Quando seu FPGA executa o print("\n\f") ele realmente está enviando dois bytes em seu stdout, o primeiro é um avanço de linha e o segundo é um formfeed. Esses bytes são 0x0A e 0x0C.

Em seguida, o stdout é transferido pelo cabo USB e lido por meio de um dispositivo serial emulado. Este dispositivo serial irá apenas transferir os dois bytes para o terminal de controle (porque você está lendo através do comando cat ), e eventualmente para o seu gnome-terminal, xterm ou qualquer outro programa que você esteja usando. Este emulador de terminal precisa entender os dois bytes e agir de acordo.

Então, você precisa verificar os recursos do seu emulador. Qual você está usando?

    
por 30.04.2013 / 18:21
1

Encontrei muitas referências on-line que dizem que o bash deve interpretar \f como uma tela clara. E, como muitos dizem, isso não funciona.

Você pode ser capaz de mexer com as configurações de stty para fazer com que ele interprete \f corretamente (que neste contexto seria escrito como ^L para Ctrl + L ). Mas não consegui encontrar nada óbvio.

Uma solução alternativa seria alterar seu código. Mas não há fácil, maneira multiplataforma para limpar a tela. No entanto, existem muitas maneiras de escolher. Se possível, você pode vincular em uma biblioteca de maldições e usar isso. Ou stdlib.h e use system() .

Pessoalmente, a maneira como sempre fiz isso é enviar o Código de escape ANSI :

printf("3[2J");

Tenho certeza que o bash vai interpretar isso muito bem. E você só precisa certificar-se de ativar a compatibilidade ANSI / VT100 ao usar o PuTTY ou o Hyperterminal.

    
por 30.04.2013 / 16:17
1

O GNU sed não é essencial para resolver este problema (embora o script seja mais fácil de ler). Um script mínimo é (testado com o Solaris e o OSX):

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

onde ^L e ^[ são os caracteres de controle literais para controle de formulário controle L e controle de escape [ . Você pode inserir aqueles em um arquivo usando vi (para inserir o caractere de escape, primeiro digite controle V ).

As seqüências de escape são usadas para

  • mova o cursor para a posição inicial ^[[H e
  • limpe a exibição ^[[J

Algumas notas:

  • não é necessário fornecer a linha e a coluna na ^[[H escape (e, em qualquer caso, as posições começam com 1 , não 0 ) e
  • se a tela foi limpa antes mover o cursor, será necessário um 2 no escape, por exemplo, ^[[2J , porque isso limpa todo o display. O ^[[J padrão é apagado da posição atual até o final da exibição. Alguns terminais fora do padrão, por exemplo, ansi.sys não fizeram essa distinção.

Algumas pessoas estão confusas com o uso de ^L pelo bash para um atalho de teclado para limpar a tela, bem como com a interpretação do PuTTY de ^L (veja Por que a tela não limpa quando eu digito controle / L? na FAQ do XTerm.

Leitura adicional:

por 06.04.2016 / 03:06
0

Como o problema é sobre a emulação correta de um terminal ANSI, acho que a melhor opção é conectar-se ao conversor serial-para-USB com minicom . Lembre-se de abrir o dispositivo serial sem inicializar o modem, ou seja, sem enviar comandos hayes na inicialização.

    
por 30.04.2013 / 23:14