Estou me conectando a uma conexão serial USB em/dev/ttyACM0. O código do lado do remetente envia um \f
caractere 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
no console, a saída rola para baixo na tela em vez de ser atualizada na parte superior.
Pesquisei as stty
configuraçõ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 --help
pá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 --version
give 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 ^L
e ^[
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
^[[H
e - limpar a tela
^[[J
Algumas notas:
- não é necessário fornecer a linha e a coluna no
^[[H
escape (e em qualquer caso, as posições começam com1, não0), e - se a tela fosse limpaantesmovendo o cursor,
2
seria necessário a no escape, por exemplo,^[[2J
, porque isso limpa toda a exibição. O padrão^[[J
vai da posição atual até o final da exibição. Alguns terminais fora do padrão, por exemplo,ansi.sys
não faziam essa distinção.
Algumas pessoas ficam confusas com o uso do bash ^L
como 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[2J
Limpar tela,: \033[0;0H
Vá 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 cat
comando) 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.