직렬 포트로 데이터를 보내고 응답을 보는 방법은 무엇입니까?


37

Linux에서는 명령 문자열 (예 : 일부 데이터)을 직렬 포트 (제어 문자 포함)로 보내고 응답 (일반적으로 제어 문자도 포함 할 수 있음)을 듣고 싶습니다.

Linux에서이 작업을 가능한 한 간단하게 수행하려면 어떻게해야합니까? 예를 들어 주셔서 감사합니다!



요격이 설치되어 있지 않습니다.
Alex

재개를 위해 추천-그것은 제안대로 중복되지 않습니다.
peterph

어떤 사람들은 너무 어리석기 때문에 질문을 이중으로 제안합니다. 먼저 질문과 답변을 읽는 것을 귀찮게하십시오.
Denis

답변:


54

Unix의 모든 장치는 장치 파일에 매핑되며 직렬 포트는 /dev/ttyS0 /dev/ttyS1...입니다.

먼저 해당 파일에 대한 권한을 살펴보고 사용한다고 가정합니다 /dev/ttyS1.

ls -l /dev/ttyS1

read.write 액세스를 원할 것입니다. 이것이 공유 시스템 인 경우 모든 사용자에게 개방 된 보안 결과를 고려해야합니다.

chmod o+rw /dev/ttyS1

파일에 쓰는 매우 간단한 조잡한 방법은 간단한 echo명령을 사용하는 것 입니다.

echo -ne '\033[2J' > /dev/ttyS1

읽고

cat -v < /dev/ttyS1

한 터미널에서 고양이를 실행하고 두 번째 터미널에서 에코를 수행 할 수 있습니다.

모든 것이 횡설수설 인 경우 전송 속도, 비트 설정은 전송을 시작하기 전에 설정해야합니다. stty그렇게 할 것입니다. !! 참고 stty는 stdin을 기본 파일 설명 자로 사용합니다.

동등한 명령.

stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1

이것은 당신이 무언가를 스크립트하고 기록하기에 충분할 수 있습니까? 당신이 무엇을 달성하려고하는지 확실하지 않습니다.

더 대화 형의 경우 기본 설정 방법은 minicom지금까지 언급 한 모든 것을 수행하는 프로그램 일 것입니다. (Windows의 하이퍼 터미널과 비슷하지만 익숙 할 것입니다).

중간 솔루션 screen은 직렬 장치에서 작동 하는 터미널 프로그램을 사용합니다 .

screen /dev/ttyS1

man screen man minicom man stty 자세한 내용은


출력이 전혀 없습니다. 어떤 아이디어가 있습니까?
Goldname

아마도 하드웨어 흐름 제어, atty 명령으로 스위치를 끄거나 직렬 케이블에서 높은 스트랩을 사용하여 널 모뎀 케이블을 검색하십시오.
X Tian

1
# stty -speed 38400 -f /dev/ttyUSB1반환stty: invalid argument '-speed'
Pro Backup

1
stty에서 장치를 설정하는 것은 -F (자본 F)입니다. 또한 속도 매개 변수가 잘못되었습니다. 속도를 사용하여 포트의 전송 속도를 얻거나 ispeed 또는 ospeed (빼기 부호없이)를 사용하여 입력 및 출력 속도를 설정하거나 숫자 만 입력 및 출력 속도를 설정하여 다음과 같이 지정할 수 있습니다. stty 19200 -F / dev / ttyS ....
Paulus

놀랍게도 아무도 예를 보지 못 했으므로 @Pro Backup에 감사드립니다.
X Tian

11

두 개의 터미널 만 열면됩니다. 첫 번째 터미널 cat에서 장치의 모든 것, 예 :

cat /dev/ttyS0

다른 터미널에서는 다음과 같이 임의의 16 진수 문자와 텍스트를 터미널에 보낼 수 있습니다.

echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0

echo -e명령을 사용하면 백 슬래시 이스케이프를 해석 할 수 있습니다.

물론 (i) 직렬 설정 (속도, 워드 길이, 흐름 Ctrl 등)이 정확하고 (ii) 직렬 장치 (다른 쪽 끝)가 차단되지 않는지 확인해야합니다.


위의 답변을 작성한 후 10 분 동안 답변을 받았고 더 이상 정보를 추가하지 않았습니다!
X Tian

죄송합니다. 귀하의 답변을 완전히 읽지 못했습니다. 본인의 답변이 본인의 답변에 포함되어 있음을 확인 했으므로 본인이 설명한 내용을 설명한대로 귀하의 답변을 올바른 답변으로 받아들입니다.
Alex

COM 포트에 대해 잘 모릅니다. "다른 쪽의 직렬 장치가 차단하지 않는다"는 것이 무엇을 의미하는지 설명해 주시겠습니까? 방화벽에 문제가 있습니까?
Sopalajo de Arrierez

9

직렬 장치와 통신하는 프로그램 :

picocom
minicom
socat

또는 쉘에서 다음을 수행 할 수 있습니다.

stty -speed 19200 < /dev/ttyS0 # sets the speed of the port
exec 99<>/dev/ttyS0 (or /dev/ttyUSB0...etc)
printf "AT\r" >&99
read answer <&99  # this reads just a CR
read answer <&99  # this reads the answer OK
exec 99>&-

당신은 양방향 파일 설명자에 대해 가르쳐 준 멋진 답변입니다. 그러나 설명자를 닫는 마지막 줄 구문이 올바른지 확인하십시오. 구문 오류가 발생합니다. 나도 생각 exec 99<&-이나 exec 99>&-사용되어야한다. 아니면 둘 다?
양키

1
오타 .. 당신이 맞아
Zibri

7

이것은 더 나은 접근 방법이 될 수 있습니다.

stty -F /dev/ttyUSB0 115200 raw -echo   #CONFIGURE SERIAL PORT
exec 3</dev/ttyUSB0                     #REDIRECT SERIAL OUTPUT TO FD 3
  cat <&3 > /tmp/ttyDump.dat &          #REDIRECT SERIAL OUTPUT TO FILE
  PID=$!                                #SAVE PID TO KILL CAT
    echo "R" > /dev/ttyUSB0             #SEND COMMAND STRING TO SERIAL PORT
    sleep 0.2s                          #WAIT FOR RESPONSE
  kill $PID                             #KILL CAT PROCESS
  wait $PID 2>/dev/null                 #SUPRESS "Terminated" output

exec 3<&-                               #FREE FD 3
cat /tmp/ttyDump.dat                    #DUMP CAPTURED DATA

프로세스를 자동화하기 때문에 매우 좋습니다! 내가 선택적으로 할 수있는 유일한 변경 사항은 수신 된 내용이 전송 된 것과 동일하다는 것을 확인하는 것입니다.
HiDefLoLife

4

다음과 같이 장치를 동시에 읽고 쓸 수 있습니다.

cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411

귀하의 메시지가 두 번째로 전송 cat에서 stdin, 첫 번째 cat로 릴레이 응답 stdout채팅방에 터미널을 선회.

완료하려면 을 다시 한 번 ctrl-c실행 하십시오.fgctrl-c

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.