그래서 Tx에서 Rx로 배선만 하면 자체적으로 루프백되는 표준 RS232 직렬 포트가 있습니다. 두 개의 별도 터미널에서 실행하여 echo
루프백을 테스트하고 있습니다.cat
cat /dev/ttyS1
echo "hi" > /dev/ttyS1
내 문제는 출력입니다. cat을 실행하는 터미널에 "hi"가 표시될 것으로 예상했지만 결과는 다음과 같습니다.
hi
[2 newlines]
hi
[4 newlines]
hi
[8 newlines]
hi
[16 newlines]
hi
[32 newlines]
hi
ctrl...그리고 i + 까지 계속됩니다 c cat
.
cat을 중단한 후 다시 실행하면 echo를 두 번째 실행할 때까지 "hi"가 출력되지 않습니다.
이게 정상인가요? 왜 이런 동작이 나타나는지 아시나요?
편집하다: 개행 문자란 ASCII 를 의미합니다 0x0A
. 이 출력에는 캐리지 리턴이 없습니다.
답변1
Bruce의 두 번째 댓글 덕분에 제가 직접 문제를 해결할 수 있었습니다.
실행한 후 stty -a -F /dev/ttyS1
문제를 일으키는 옵션이 "echo", "onlcr" 및 "icrnl" 3가지라는 것을 발견했습니다.
직렬 포트가 자체적으로 루프백하므로 실행 후 발생하는 상황은 다음과 같습니다 echo "hi" > /dev/ttyS1
.
- 이
echo
명령은 기본적으로 메시지 끝에 개행 문자를 추가하므로 "hi" + LF가 /dev/ttyS1로 전송됩니다. - "onlcr"이 설정되어 있으므로 직렬 장치는 LF를 CRLF로 변환하므로 Tx 라인에서 나오는 물리적 메시지는 "hi" + CRLF입니다.
- Rx 라인에서 수신된 물리적 메시지에는 "icrnl"이 설정되어 있으므로 CR이 LF로 변환됩니다. 따라서 'cat'이 출력하는 메시지는 "hi" + LFLF입니다.
- "echo"가 설정되었으므로 Rx에서 수신된 메시지("hi" + LFLF)는 Tx 라인을 통해 다시 전송됩니다.
- onlcr 때문에 "hi"+LFLF는 "hi"+CRLFCRLF가 됩니다.
- "hi" + CRLFCRLF는 icrnl로 인해 "hi" + LFLFLFLF가 되었습니다.
- "hi" + LFFLFLF는 에코로 인해 Tx로 전송됩니다.
등...
이 문제를 해결하기 위해 다음 명령을 실행했습니다.
stty -F /dev/ttyS1 -echo -onlcr
"echo"를 비활성화하면 메시지가 무한정 반복되는 것을 방지하고 "onlcr"을 비활성화하면 직렬 장치가 출력 시 LF를 CRLF로 변환하는 것을 방지합니다. 이제 cat
실행할 때마다 "hi"(개행 문자 포함!) 메시지를 받게 됩니다 echo
.
CR = 캐리지 리턴 문자(ASCII 0x0D) LF = 줄 바꿈 또는 줄 바꿈 문자(ASCII 0x0A)
답변2
테스트를 위해 파일을 직렬 tty에 연결하는 데 비슷한 문제가 있었습니다. 허용되는 답변 외에도 다음이 포함됩니다.
다음을 수행하여 직렬 출력을 테스트하는 경우 cat somefile.txt > /dev/ttyS0
정확한 바이트 값을 테스트하는 경우 예상치 못한 바이트 데이터가 많이 발생합니다.
stty
간단한 작업을 수행하면 stty raw -F /dev/ttyS0
터미널이 문자를 삽입/바꾸는 것을 방지할 수 있습니다(예: [...] 0x0A [...]
-> [...] 0x0D 0x0A [...]
). 이 raw
플래그는 터미널의 모드를 변경하여 입력 및 출력 처리가 수행되지 않습니다.