Como configuro minha sessão tty de forma que um caractere `\f` do feed de formulário limpe o terminal?

Como configuro minha sessão tty de forma que um caractere `\f` do feed de formulário limpe o terminal?

Estou me conectando a uma conexão serial USB em/dev/ttyACM0. O código do lado do remetente envia um \fcaractere 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/ttyACM0no console, a saída rola para baixo na tela em vez de ser atualizada na parte superior.

Pesquisei as sttyconfigurações atuais (digitando stty -F /dev/ttyACM0 -a) que fornecem 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 stty --helppágina dá atraso no feed do formulário ( ff0), mas não indica como alterar mais nada. Eu também encontreiesta páginao que indica que posso definir o caractere FormFeed assim FormFeed=014, mas essa sintaxe não funcionou para minha versão stty ( stty --versiongive stty (GNU coreutils) 8.5).

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

Responder1

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

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

onde ^Le ^[são os caracteres de controle literais para form-feed controlLe escape control[. Você pode inseri-los em um arquivo usando vi(para inserir o caractere de escape, primeiro digite controlV).

As sequências de escape são usadas para

  • mova o cursor para a posição inicial ^[[He
  • limpar a tela^[[J

Algumas notas:

  • não é necessário fornecer a linha e a coluna no ^[[Hescape (e em qualquer caso, as posições começam com1, não0), e
  • se a tela fosse limpaantesmovendo o cursor, 2seria necessário a no escape, por exemplo, ^[[2J, porque isso limpa toda a exibição. O padrão ^[[Jvai da posição atual até o final da exibição. Alguns terminais fora do padrão, por exemplo, ansi.sysnão faziam essa distinção.

Algumas pessoas ficam confusas com o uso do bash ^Lcomo um atalho de teclado para limpar a tela, bem como com a interpretação do PuTTY ^L(vejaPor que a tela não limpa quando digito control/L?nas perguntas frequentes do XTerm).

Leitura adicional:

Responder2

Você precisa substituir o caractere de feed de formulário ( \f) pelo adequadoCódigos de escape ANSI.

Você pode fazer isso comGNU sed:

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

Em detalhe: \033[2JLimpar tela,: \033[0;0HVá para a posição 0,0

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

EDITAR: como@MarkReel comentou, você pode usar para versões sed não-GNU (por exemplo, BSD sed) strings de escape ANSI:

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

Responder3

Quando seu FPGA executa ele print("\n\f")está realmente enviando dois bytes em seu stdout, o primeiro é um linefeed 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 ambos os bytes para o terminal de controle (porque você o está lendo através do catcomando) e, eventualmente, para o seu terminal gnome, 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ê deve verificar as capacidades do seu emulador. Qual você está usando?

Responder4

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

informação relacionada