화면을 직렬 터미널로 사용하고 키를 눌러 CR+LF 자동 모드를 시뮬레이션하는 방법

화면을 직렬 터미널로 사용하고 키를 눌러 CR+LF 자동 모드를 시뮬레이션하는 방법

screen을 직렬 터미널로 사용하고 싶지만 출력 형식이 올바르지 않습니다. 나는 다음 명령을 사용합니다.

sudo screen /dev/ttyACM0 9600,cs8

위 구성이 패리티 및 흐름 제어 구성이 없는 9600 8N1과 같다고 생각하면 다음과 같은 결과가 나타납니다.

This program runs since 135 seconds.
                                                This program runs since 136 seconds.
                                                                                    This program runs since 137 seconds.
                    This program runs since 138 seconds.
                                                        This program runs since 139 seconds.
                                                                                            This program runs since 140 seconds.
                                This program runs since 141 seconds.

CR LF auto modeQTKTerm에서는 구성 메뉴를 설정할 때까지 동일한 결과를 얻었습니다 .

This program runs since 759 seconds.
This program runs since 760 seconds.
This program runs since 761 seconds.

화면에서 동일한 결과를 얻으려면 어떻게 해야 합니까?

당신의 도움을 주셔서 감사합니다.

답변1

TLDR: 그럴 수 없습니다. stty설정을 통해 전달된 모든 옵션은 화면이 시작될 때 무시됩니다. ocrnl/onlcr/icrnl/inlcr캐리지 리턴 및 줄 바꿈을 구성하는 데 필요한 옵션은 지원하지 않습니다 . 터미널 장치를 독점 모드로 열므로 화면이 시작된 후에는 stty를 사용하여 이러한 옵션을 변경할 수 없습니다. 이는 2020년 2월 5일자 Screen 버전 4.08.00(GNU)에도 해당됩니다.

긴 테이블:

저도 같은 문제에 부딪혀 스택교환에서 관련된 여러 질문과 답변을 검색해봤습니다. 나는 이런 결론을 내릴 수밖에 없었다화면 \n에서 캐리지 리턴(CR; \r) 대신 줄 바꿈(LF; )을 보내도록 할 수 없습니다., 적어도 소스 코드를 변경하고 다시 컴파일하지 않고 말이죠.

이 문제CR 대신 화면에서 LF를 보내는 방법을 묻습니다. 아직 답변이 없습니다.이 답변 잘못되었습니다( stty -F /dev/YOURSERIALDEVICE YOURBAUDRATE raw화면이 tty를 구성하는 방식을 변경하지 않음).이 답변Picocom이 제안되었지만 올바른 개행 문자를 보내도록 화면을 얻는 방법에 대한 질문에는 대답하지 않습니다. 그러나 작동합니다.

picocom /dev/YOURSERIALDEVICE --baud YOURBAUDRATE --omap crcrlf --echo
# (press Control+a Control+x to exit)

이 문제를 해결하는 방법에 대한 몇 가지 팁이 있습니다.화면stty 매뉴얼 페이지에서. Screen은 tty 파일 뒤에 쉼표로 구분된 옵션 목록을 stty로 전달하므로 다음 옵션 중 일부가 도움이 될 수 있습니다.

> man stty
# (output abridged..)
Input settings:
       [-]icrnl    translate carriage return to newline
       [-]inlcr    translate newline to carriage return
Output settings:
       [-]ocrnl    translate carriage return to newline
       [-]onlcr    translate newline to carriage return-newline
       [-]onlret   newline performs a carriage return

다만, 입력과 출력을 \r으로 바꾸도록 설정하고, 으로 바뀌지 않는지 \n확인하고 , 설정되지 않았는지 확인하는 것은... 별 차이가 없고,\n\ronlret

screen /dev/YOURSERIALDEVICE YOURBAUDRATE,ocrnl,-onlcr,icrnl,-inlcr,-onlret

동작은 이전과 동일합니다. 왜 화면에 이러한 옵션이 적용되지 않는지 잘 모르겠습니다.이 답변막연하게 유사한 문제의 경우 stty를 사용하여 옵션을 변경하는 것이 좋습니다.

> stty -F /dev/YOURSERIALDEVICE YOURBAUDRATE ocrnl -onlcr icrnl -inlcr -onlret
> screen /dev/YOURSERIALDEVICE

시작 시 stty가 수행한 모든 구성을 화면이 재설정하기 때문에 이는 아무 작업도 수행하지 않습니다.이 답변stty를 실행할 수 있다고 주장함뒤쪽에화면이 시작되지만 이렇게 하면 오류가 발생합니다 Device or resource busy.

이 답변또한 화면의 CR/LF 문제도 해결되었습니다. 그것은 다음을 가리킨다창 유형온라인 설명서의 화면 섹션.

  • "연결 회선을 사용 중으로 표시하기 위해 노드에서 독점 열기를 시도합니다."-- 따라서 부팅 화면 이후에는 tty 옵션을 변경할 수 없어야 합니다.

  • baud_rate, cs8/cs7(바이트당 비트) ixon/off및 옵션 만 istrip문서화되어 있습니다. 이는 화면이 ocrnl 등을 인식/지원하지 않음을 의미할 수 있습니다.

간단히 말해서:\nCR( ) 대신 LF( )를 보내도록 화면을 얻는 방법 에 대한 질문은 \r다양한 스택 교환 사이트에서 여러 번 요청되었습니다. 제공된 답변 중 어느 것도 작동하지 않으며 문서를주의 깊게 읽어 보면 이것이 현재 불가능하다는 것을 알 수 있습니다.

답변2

~에 따르면screen설명서, 에서창 유형:

tty(문자 특수 장치) 이름(예: "/dev/ttya")이 첫 번째 인수로 지정되면 창이 해당 장치에 직접 연결됩니다. 이 창 유형은 "screen cu -l /dev/ttya"장치 노드에 대한 읽기 및 쓰기 액세스가 필요하며 연결 ​​회선을 사용 중으로 표시하기 위해 노드에서 단독 열기가 시도됩니다. '로 표기되는 쉼표로 구분된 플래그 목록으로 구성된 선택적 인수가 허용됩니다.스티티(1)':

가능한 플래그 목록을 계속하지만 다음을 추가합니다.

가능한 한 많은 적용 가능한 옵션을 지정할 수 있습니다. 옵션을 지정하지 않으면 터미널 드라이버가 연결에 대한 매개변수 값을 구성하게 됩니다. 이러한 값은 시스템에 따라 다르며 기본값이거나 이전 연결에서 저장된 값일 수 있습니다.

더 많은 정보를 찾을 수 있는 일반적인 장소는 다음과 같습니다.stty수동으로 의사 터미널 연결이 이러한 추가 플래그를 지원하기 때문입니다 stty.

onlcr문제와 가장 유사한 오작동은 "출력 설정" 아래에 나열된 플래그를 추가하여 수정해야 합니다.

[-]onlcr
개행 문자를 캐리지 리턴으로 변환 - 개행 문자

예를 들어:

sudo screen /dev/ttyACM0 9600,cs8,onlcr

그러나 댓글에서 지적했듯이,screen이 정보를 직접 처리하세요. 이것tty.sh스크립트는 소스 코드를 생성합니다(stty 모드) 명령줄 옵션을 처리하는 데 사용되는 화면입니다. 예:CS8. 그 중 어느 것에도 아무런 영향을 미치지 않습니다.stty이 함수의 CR/NL 매핑입니다. 을 기반으로논평소스에서,

    if (!ttyflag) { /* ptys에는 적합하지 않을 수도 있습니다.. */
#정의된 경우(ICRNL)
        m->tio.c_iflag |= ICRNL;
#endif /* ICRNL */
#정의된 경우(ONLCR)
        m->tio.c_oflag |= ONLCR;
#만약을 대비해  

개발자들은 이런 종류의 구현이 어렵다고 생각하고 지원하지 않기로 결정한 것 같습니다.

답변3

이것은 나에게 많은 도움이 되었습니다. 화면에서 crlf를 활성화/비활성화할 수 있습니다.

https://gist.github.com/cabo/ce6358406f8175041813

관련 정보