Linux에서는 명령 문자열(예: 일부 데이터)을 직렬 포트(제어 문자 포함)로 보내고 응답(종종 제어 문자도 포함할 수 있음)을 수신하고 싶습니다.
Linux에서 가능한 한 쉽게 이 작업을 수행하려면 어떻게 해야 합니까? 감사를 표현하는 예를 들어보세요!
답변1
Unix의 모든 장치는 장치 파일에 매핑되며 직렬 포트는 /dev/ttyS0
/dev/ttyS1
... .
./dev/ttyS1
ls -l /dev/ttyS1
읽기 및 쓰기 액세스 권한이 필요하며, 공유 시스템인 경우 모든 사람에게 공개함으로써 보안에 미치는 영향을 고려해야 합니다.
chmod o+rw /dev/ttyS1
파일에 쓰는 매우 간단하고 조악한 방법은 간단한 echo
명령을 사용하는 것입니다.
echo -ne '\033[2J' > /dev/ttyS1
그리고 읽어보세요
cat -v < /dev/ttyS1
cat을 한 터미널에서 실행하고 두 번째 터미널에서 echo할 수 있습니다.
모든 것이 횡설수설이라면 전송을 시작하기 전에 전송 속도, 비트 설정을 설정해야 할 수도 있습니다. stty
그렇게 할 것입니다. !!stty는 stdin을 기본 파일 설명자로 사용하면 영향을 받습니다.
동등한 명령.
stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1
스크립트와 로그를 작성하는 데 이 정도면 충분할까요? 무엇을 달성하고 싶은지 잘 모르겠습니다.
좀 더 대화형으로 사용하려면 기본 설정 방법은
minicom
지금까지 언급한 모든 작업을 수행하는 프로그램을 사용하는 것임을 기억하세요. (익숙한 Windows의 HyperTerminal과 유사합니다.)
screen
중간 솔루션은 직렬 장치에서 실행될 수 있는 터미널 프로그램을 사용하는 것입니다.
screen /dev/ttyS1
man screen
man minicom
man stty
더 많은 정보를 알고 싶다면
답변2
두 개의 터미널을 열기만 하면 됩니다. 첫 번째 터미널에서는 다음 cat
과 같은 장치에서 모든 것을 얻을 수 있습니다.
cat /dev/ttyS0
다른 터미널에서는 다음과 같이 임의의 16진수 문자와 텍스트를 터미널로 보낼 수 있습니다.
echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0
이 echo -e
명령을 사용하면 백슬래시 이스케이프를 해석할 수 있습니다.
물론 (i) 직렬 설정(속도, 단어 길이, 흐름 제어 등)이 올바른지, (ii) 직렬 장치(다른 쪽 끝)가 차단되지 않는지 확인해야 합니다.
답변3
직렬 장치와 통신하는 프로그램:
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>&-
답변4
다음과 같이 동시에 장치를 읽고 쓸 수 있습니다.
cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411
cat
stdin
귀하의 메시지는 첫 번째 메시지가 cat
응답을 전달 하는 두 번째 메시지에서 전송되어 stdout
터미널을 채팅방으로 전환합니다.
완료하고 ctrl-c
다시 실행합니다.fg
ctrl-c