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


18

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

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

내 문제는 출력과 관련이 있습니다. 나는 고양이를 실행하는 터미널에서 하나의 "hi"가 다시 나타날 것을 기대하지만 대신 나는 이것을 얻는다.

hi
[2 newlines]
hi
[4 newlines]
hi
[8 newlines]
hi
[16 newlines]
hi
[32 newlines]
hi

... 그리고 내가 ctrl+ 때까지 c cat.

cat을 중단 한 후 다시 실행하면 echo를 다시 실행할 때까지 "hi"가 출력되지 않습니다.

이것이 정상입니까? 내가 왜이 동작을보고 있는지 아십니까?

편집 : 줄 바꿈으로 ASCII를 의미 0x0A합니다. 이 출력에는 캐리지 리턴이 없습니다.


동일한 장치를 여는 두 개의 프로세스로 인해 발생할 수 있습니까? 당신이 tip /dev/ttyS1( ~.종료) 를 실행 하고 거기에 데이터를 입력하려고하면 어떻게됩니까? 와이어가 연결되면 전송 된 내용을 수신하므로 터미널에 표시되어야합니다.
mrb

3
당신이 있습니까 정말 줄 바꿈을 받고, 또는 캐리지 리턴 / 줄 바꿈 쌍? 작업 수준에서 구별이 중요합니다. "cat / dev / ttyS1> somefile"을 시도한 다음 "od -x somefile"을 수행하여 TTY 장치 파일에서 어떤 바이트가 나오는지 정확히 확인하십시오. 또한 "stty -F / dev / ttyS1 -a"를 수행하십시오. "stty"에 대한 매뉴얼 페이지를 읽고 모든 작은 설정에 대해 stty의 결과가 무엇을 알려주는지보십시오. RS232 시리얼 통신은 까다 롭습니다.
브루스 에디 거

답변:


21

Bruce의 두 번째 의견 덕분에 문제를 스스로 알아낼 수있었습니다.

을 (를) 실행 한 후 stty -a -F /dev/ttyS1"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)


-icrnl나를 위해 트릭을했다.
tcpaiva

3

테스트를 위해 파일을 직렬 tty로 연결하는 것과 비슷한 문제가있었습니다. 허용 된 답변 외에 :

다음과 같은 작업을 수행하여 직렬 출력을 cat somefile.txt > /dev/ttyS0테스트하는 경우 정확한 바이트 값을 테스트하는 경우 예기치 않은 바이트 데이터가 많이 발생합니다.

함께 stty단순 하 stty raw -F /dev/ttyS0문자 치환 / 삽입하는 단말을 정지한다 (예 [...] 0x0A [...]-> [...] 0x0D 0x0A [...]). raw에는 입출력 처리가 수행되지 않도록 플래그는 단말기의 모드를 변경한다.


1
흠 ...은 stty raw기본적으로 에코를 비활성화하는 것처럼 보이지 않습니다 . 해야 할 수도 있습니다 stty raw -echo.
BMiner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.