echo 및 cat을 사용하여 직렬 루프백을 테스트하는 예기치 않은 결과

echo 및 cat을 사용하여 직렬 루프백을 테스트하는 예기치 않은 결과

그래서 저는 Tx에서 Rx로 와이어를 연결하여 자체적으로 루프백되는 표준 RS232 직렬 포트를 가지고 있습니다. 두 개의 별도 터미널에서 echo및 를 실행하여 루프백을 테스트하고 있습니다 .cat

cat /dev/ttyS1
echo "hi" > /dev/ttyS1

내 문제는 출력에 있습니다. cat을 실행하는 터미널에 "안녕"이라는 문자가 다시 나타날 것으로 예상했지만 대신 다음과 같은 결과를 얻었습니다.

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문제를 일으키는 것으로 확인된 3가지 옵션인 "echo", "onlcr" 및 "icrnl"이 있었습니다.

이 직렬 포트는 자체적으로 루프백되므로 실행 후 발생한 상황은 다음과 같습니다 echo "hi" > /dev/ttyS1.

  1. echo명령은 기본적으로 메시지 끝에 개행 문자를 추가하므로 "hi" + LF가 /dev/ttyS1로 전송됩니다.
  2. "onlcr"이 설정되었기 때문에 직렬 장치는 LF를 CRLF로 변환하여 Tx 라인으로 전송된 물리적 메시지는 "hi" + CRLF가 되었습니다.
  3. "icrnl"이 설정되었기 때문에 Rx 라인에서 수신된 물리적 메시지는 CR을 LF로 변환했습니다. 따라서 'cat'이 출력한 메시지는 "hi" + LFLF였습니다.
  4. "echo"가 설정되었기 때문에 Rx("hi" + LFLF)에서 수신된 메시지는 Tx 라인을 통해 다시 전송되었습니다.
  5. onlcr 때문에 "hi" + LFLF가 "hi" + CRLFCRLF가 되었습니다.
  6. icrnl 때문에 "hi" + CRLFCRLF가 "hi" + LFLFLFLF가 되었습니다.
  7. 에코 때문에 "hi" + LFLFLFLF가 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는 터미널의 모드를 변경하므로 입력 및 출력 처리가 수행되지 않습니다.

관련 정보