입력 텍스트(화면)를 직렬 포트에 한 번에 한 줄씩(한 번에 문자 대신) 보내려면 어떻게 해야 합니까?

입력 텍스트(화면)를 직렬 포트에 한 번에 한 줄씩(한 번에 문자 대신) 보내려면 어떻게 해야 합니까?

직렬 포트를 통해 Arduino와 통신하기 위해 screen을 사용하고 있습니다. 다음과 같은 화면이 시작됩니다.

screen /dev/ttyACM0 115200

그런 다음 명령을 보내려고 하는데 키보드에서 누르는 모든 키가 즉시 전송됩니다. EnterArduino에 입력을 보내기 전에 키를 누를 때까지 기다리게 하려면 어떻게 해야 합니까?


이것은 내 직렬 장치 /dev/ttyACM0설정입니다.

$ sudo ssty -F /dev/ttyACM0 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 100; time = 2;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc

.screenrc파일이 비어 있습니다.

답변1

저는 Arduino 장치를 사용하지 않기 때문에 구체적인 도움을 드릴 수는 없지만, 다른 답변이 없을 경우 특정 문제를 해결하는 방법에 대한 몇 가지 일반적인 팁(UNIX/Linux 측의 경우)을 제공하려고 노력할 수 있습니다.

안타깝게도 데이터를 한 줄씩 전송하도록 직렬 포트를 설정할 수 없습니다. 이는 애플리케이션, 즉 사용하는 터미널 에뮬레이터의 책임입니다 screen. 하지만 유감스럽게도(AFAIK) screen다른 터미널 에뮬레이터 응용 프로그램 중 어느 것도 줄 기반 모드로 입력하는 것을 허용하지 않습니다.

expect와 같은 도구 나 일반적으로 한 줄씩 데이터를 보내는 minicom동반 명령 runscript( line 과 유사 )을 expect사용하여 유용한 것을 얻는 것을 선호할 수 있습니다 .

그렇지 않으면 아마도 또 다른 좋은 조치로 (매우) 기본적인 라인 지향 "터미널 애플리케이션"을 직접 구현할 수 있습니다.

이것은 종종 미친 짓이지만 쉽게 할 수 있습니다귀하의 특정 상황에 맞게 조정, 셸에서 몇 가지 명령만 수행하면 됩니다.

(
set -e
prev_settings="$(stty -g -F /dev/ttyACM0)"
trap 'stty "${prev_settings}" -F /dev/ttyACM0' EXIT
stty -F /dev/ttyACM0 raw -echo -echoe -echok -echoctl -echoke
cat < /dev/ttyACM0 &
cat > /dev/ttyACM0
)

이는 set -e 다음 명령에서 첫 번째 오류(있는 경우)가 발생할 때 실행을 종료하는 데 사용됩니다.

stty -g직렬 포트의 현재 설정을 저장합니다 .

trap 명령을 종료할 때 저장된 설정이 복원되도록 설정합니다 .

stty raw ...직렬 포트에 대해 가장 합리적인(이 특별한 경우에) 설정을 설정하십시오 .

첫 번째 cat 명령은 Arduino에서 터미널 창으로 들어오는 모든 내용을 출력합니다.

그 시점부터 두 번째 cat 명령은 입력한 모든 내용을 Arduino로 보냅니다.

이 명령 세트를 종료하려면 Ctrl-C를 입력하면 됩니다.

여기서 "트릭"은 간단합니다. 명령은 cat 요청한 대로 출력을 한 줄씩 전송하도록 설계되었습니다.

반면 설정으로 인해 입력 cat 명령(첫 번째 명령 cat)은 Arduino의 모든 문자를 즉시 ​​표시합니다 stty raw. Arduino가 데이터 스트림을 보내는 경우 min 100 time 2현재 출력 stty -a에 표시되는 설정을 추가해야 할 수도 있습니다 . 스트림의 경우 콘텐츠가 더 빠르게 표시될 수 있습니다.

괄호는 서브셸에서 이러한 명령을 실행하는 데 사용되므로 trap tty 설정을 쉽게 복원할 수 있습니다. 명령을 스크립트에 넣고(물론 괄호 없이) 실행할 수도 있습니다.

위 명령을 사용할 때 직렬 포트에 액세스할 수 있는 다른 응용 프로그램을 종료하거나 일시 중지하는 것이 가장 좋습니다. 그렇지 않으면 서로 간섭할 수 있습니다.

이 간단한 솔루션은 Arduino 장치가 다음을 지원하는 경우 가장 잘 작동합니다.아니요수신한 내용을 에코합니다. 그렇다면 무엇을 입력하든 두 번 표시됩니다. 한 번은 실제 입력으로, 한 번은 Arduino의 에코로 표시됩니다. 문제는 터미널에 표시되는 내용을 Arduino가 제어할 수 없다는 것입니다.왜냐하면행 기반 설정. 문자 표시를 끄기 위해 로컬에서 수행하여 끌 수도 있지만 Arduino로 보내기 전에 입력 중인 내용을 확인하는 것이 더 좋을 것 같습니다.

내가 마지막으로 알아차린 점은(대수롭지 않기를 바라지만) 귀하의 직렬 포트가 로 분류되었다는 것입니다 ttyACM. 이는 일반적으로 귀하가 사용하고 있는 직렬 포트가 몇 가지 추가 기능을 가지고 있다고 광고했음을 의미합니다. 그렇지 않으면 시스템이 보다 일반적인 포트로 분류됩니다 ttyUSB. ttyACM단순한 직렬 포트보다는 전용 직렬 장치(예: 3G/4G 셀룰러 모뎀)가 더 일반적입니다 . 그러나 실제로는 실제 문제를 일으키지 않는 어리석은 칩이 장착된 직렬 포트일 수도 있지만 누가 압니까?

화타이

관련 정보