폼 피드 "\f"가 터미널을 지우도록 tty 세션을 어떻게 구성합니까?

폼 피드 "\f"가 터미널을 지우도록 tty 세션을 어떻게 구성합니까?

/dev/ttyACM0의 USB 직렬 연결에 연결 중입니다. 발신자의 코드는 \f주기적으로 한 문자를 보냅니다.

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

그러나 cat /dev/ttyACM0콘솔에서 실행하면 출력이 화면 상단에서 새로 고쳐지는 대신 화면 아래로 스크롤됩니다.

stty나는 (input을 통해 ) 현재 설정을 파고 들었고 stty -F /dev/ttyACM0 -a다음과 같은 출력을 제공합니다.

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

stty --help페이지를 읽으면 페이지 피드 지연( ff0)이 발생하지만 다른 변경 방법은 표시되지 않습니다. 나도 찾았어이 페이지이는 FormFeed 문자를 이와 같이 설정할 수 있지만 FormFeed=014구문이 내 stty 버전( stty --version주어진 stty (GNU coreutils) 8.5)에서는 작동하지 않음을 보여줍니다.

Windows의 Putty는 올바른 동작을 보이지만 Debian 6에서는 작동하는 데 문제가 있습니다. 터미널이 지워질 때 페이지 피드를 해석하도록 stty를 구성하는 방법을 아는 사람이 있습니까?

답변1

이 문제를 해결하는 데 GNU sed가 필요하지는 않습니다(비록 스크립트가 읽기 더 쉽지만). 최소 스크립트는 다음과 같습니다(Solaris 및 OSX에서 테스트됨).

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

여기서 및 는 ^L페이지 나누기 및 이스케이프를 ^[위한 텍스트 제어 문자 입니다. (이스케이프 문자를 삽입하려면 먼저 입력)을 사용하여 파일에 삽입할 수 있습니다.controlLcontrol[vicontrolV

이스케이프 시퀀스는 다음 용도로 사용됩니다.

  • 커서를 시작 위치로 이동 ^[[H하고
  • 명확한 디스플레이^[[J

몇 가지 참고사항:

  • 이스케이프에서 행과 열을 제공할 필요는 없습니다 ^[[H(어쨌든 위치는 다음으로 시작됩니다).1, 아니요0), 그리고
  • 화면이 지워지면앞으로커서를 이동하려면 2이스케이프에 a가 필요합니다. 예를 들어 ^[[2J전체 디스플레이가 지워지기 때문입니다. 기본값은 ^[[J현재 위치부터 디스플레이 끝까지 내용을 지우는 것입니다. 예를 들어, 일부 비표준 터미널에서는 ansi.sys이러한 구분이 이루어지지 않습니다.

어떤 사람들은 ^Lbash가 화면을 지우기 위해 키보드 단축키를 사용하는 것과 PuTTY의 설명에 혼란스러워합니다 ^L.control/L을 입력해도 화면이 지워지지 않는 이유는 무엇입니까?XTerm FAQ에서).

추가 자료:

답변2

\f폼 피드 문자( )를 올바른 문자로 바꿔야 합니다.ANSI 이스케이프 코드.

당신은 이것을 할 수 있습니다GNU sed:

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

세부사항: \033[2J화면 지우기, \033[0;0H:pos 0,0으로 이동

(안되면 이렇게 해보세요 tail -f /dev/ttyACM0 | sed 's/\f/\o33[2J\o33[0;0H/g')

편집 : 같이@MarkReel이 댓글을 달았습니다., GNU가 아닌 sed 버전(예: BSD sed)에 ANSI 이스케이프 문자열을 사용할 수 있습니다.

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

답변3

FPGA가 실행되면 print("\n\f")실제로 표준 출력으로 2바이트를 보냅니다. 첫 번째 바이트는 개행 문자이고 두 번째 바이트는 폼 피드 문자입니다. 이 바이트는 0x0A 및 0x0C입니다.

그런 다음 표준 출력은 USB 케이블을 통해 전송되고 에뮬레이트된 직렬 장치를 통해 읽혀집니다. 직렬 장치는 제어 터미널(명령을 통해 읽기 때문에 cat)로 2바이트만 전송하고 궁극적으로 gnome 터미널, xterm 또는 사용 중인 다른 프로그램으로 전송합니다. 터미널 에뮬레이터는 이 두 바이트를 이해하고 그에 따라 작동해야 합니다.

따라서 에뮬레이터의 기능을 확인해야 합니다. 어느 것을 사용하고 있습니까?

답변4

문제는 ANSI 터미널의 올바른 에뮬레이션에 있기 때문에 minicom모뎀을 초기화하지 않고, 즉 시작 시 hayes 명령을 보내지 않고 직렬 장치를 여는 것이 가장 좋은 방법이라고 생각합니다.

관련 정보