Linux에서는 명령 문자열 (예 : 일부 데이터)을 직렬 포트 (제어 문자 포함)로 보내고 응답 (일반적으로 제어 문자도 포함 할 수 있음)을 듣고 싶습니다.
Linux에서이 작업을 가능한 한 간단하게 수행하려면 어떻게해야합니까? 예를 들어 주셔서 감사합니다!
Linux에서는 명령 문자열 (예 : 일부 데이터)을 직렬 포트 (제어 문자 포함)로 보내고 응답 (일반적으로 제어 문자도 포함 할 수 있음)을 듣고 싶습니다.
Linux에서이 작업을 가능한 한 간단하게 수행하려면 어떻게해야합니까? 예를 들어 주셔서 감사합니다!
답변:
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
자세한 내용은
# stty -speed 38400 -f /dev/ttyUSB1
반환stty: invalid argument '-speed'
두 개의 터미널 만 열면됩니다. 첫 번째 터미널 cat
에서 장치의 모든 것, 예 :
cat /dev/ttyS0
다른 터미널에서는 다음과 같이 임의의 16 진수 문자와 텍스트를 터미널에 보낼 수 있습니다.
echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0
이 echo -e
명령을 사용하면 백 슬래시 이스케이프를 해석 할 수 있습니다.
물론 (i) 직렬 설정 (속도, 워드 길이, 흐름 Ctrl 등)이 정확하고 (ii) 직렬 장치 (다른 쪽 끝)가 차단되지 않는지 확인해야합니다.
직렬 장치와 통신하는 프로그램 :
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>&-
사용되어야한다. 아니면 둘 다?
이것은 더 나은 접근 방법이 될 수 있습니다.
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