폼 피드 `\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설정을 (입력하여 ) 조사했습니다 .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 문자를 so와 같이 설정할 수 있지만 해당 구문이 stty 버전( 제공 ) FormFeed=014에서는 작동하지 않음을 나타냅니다 .stty --versionstty (GNU coreutils) 8.5

Windows의 Putty는 올바른 동작을 보이지만 Debian 6에서 작동하도록 하는 데 어려움을 겪고 있습니다. 폼 피드를 터미널 클리어로 해석하도록 stty를 구성하는 방법을 아는 사람이 있습니까?

답변1

이 문제를 해결하는 데 GNU sed가 필수적인 것은 아닙니다(스크립트가 읽기 더 쉽지만). 최소 스크립트는 다음과 같습니다(Solaris 및 OSX에서 테스트됨).

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

여기서 ^L및 는 form-feed 및 escape ^[에 대한 리터럴 제어 문자입니다 . (이스케이프 문자를 삽입하려면 먼저 를 입력하세요 ) 를 사용하여 파일에 삽입할 수 있습니다 .controlLcontrol[vicontrolV

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

  • 커서를 홈 위치로 이동 ^[[H하고
  • 디스플레이 지우기^[[J

몇 가지 참고사항:

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

어떤 사람들은 화면을 지우기 위한 키보드 단축키에 대한 bash의 사용 ^L과 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입니다.

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

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

답변4

문제는 ANSI 터미널의 올바른 에뮬레이션에 관한 것이므로 가장 좋은 옵션은 minicom. 모뎀을 초기화하지 않고, 즉 시작 시 hayes 명령을 보내지 않고 직렬 장치를 여는 것을 기억하십시오.

관련 정보