/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 --version
stty (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[vi
controlV
이스케이프 시퀀스는 다음과 같은 용도로 사용됩니다.
- 커서를 홈 위치로 이동
^[[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 명령을 보내지 않고 직렬 장치를 여는 것을 기억하십시오.