echo 및 cat을 사용한 직렬 루프백 테스트의 예상치 못한 결과

echo 및 cat을 사용한 직렬 루프백 테스트의 예상치 못한 결과

그래서 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.

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

관련 정보