타사 C 라이브러리(libmodbus중요한 경우) 직렬 장치(내 경우에는 /dev/ttyUSB0
FTDI 칩셋 기반의 USB-RS485 어댑터를 통한 RS-485와 같은 장치)를 통해 통신합니다. CLI 매개변수를 기반으로 하는 이 실행 파일은 명령을 실행한 다음(내 경우에는 Modbus 클라이언트처럼) 응답을 기다리거나(내 경우에는 외부 Modbus 서버에서) 들어오는 명령을 수신할 수 있습니다(내 경우에는 예를 들어 Modbus 서버) 그런 다음 응답을 생성합니다.
외부 장치 없이 자동으로 실행 파일을 테스트하고 싶습니다. 즉, 실행 파일의 두 인스턴스를 시작하려고 합니다.
/dev/xxxx
첫 번째 인스턴스는 Modbus 클라이언트 모드로 들어가 통신 에 사용됩니다.- 두 번째 인스턴스는 Modbus 서버 모드로 전환되어
/dev/yyyy
통신 에 사용됩니다. - 설정
/dev/xxxx
하고/dev/yyyy
둘 다 직렬 장치로 작동하며 기본적으로 동일한 와이어의 두 끝입니다.
내가 읽은 것에서pty 맨페이지, 나는 의사 터미널의 두 끝이라고 /dev/xxxx
믿습니다 . /dev/yyyy
이것은 내 질문으로 이어집니다.
- 매뉴얼 페이지는 BSD 스타일 의사 터미널을 참조하는데, 이는 내가 원하는 작업에 더 적합해 보입니다.
- BSD 스타일 의사 터미널을 올바르게 이해하고 있습니까?
- 그렇다면 BSD가 아닌 Linux 배포판에서 BSD 스타일 의사 터미널을 만드는 것이 가능합니까? 특히 저는 debian 10, 11, 12(및 Ubuntu 20.04, 22.04와 같은 debian 기반 버전)를 사용하고 있습니다.
- 매뉴얼 페이지에는 사용되는 UNIX 98 의사 터미널도 참조되어 있습니다
posix_openpt()
. 그러나 이후에도grantpt()
클라이언트에는unlockpt()
pty용 장치만 제공할 수 있으며 마스터는 실행 파일 내의 파일 설명자일 뿐입니다./dev/pts
- 내 이해는 (느슨하게 기반다음과 같은 코드) 옳은?
- 그렇다면 기본 측면 파일 설명자를 사용
/dev/xxxx
가능한 유일한 API인 올바른 파일 설명자로 변환하기 위해 어떤 트릭을 사용할 수 있습니까?Modbus 컨텍스트 가져오기
- 내가 원하는 작업을 수행할 수 있는 다른 "표준" Linux 도구가 있습니까? 이렇게 생긴 도구여기에 언급된 것들실행 파일의 STDIO가 pty에 연결될 것으로 예상합니다.
답변1
다음을 사용하여 PTY "가상 직렬 포트"를 설정할 수 있습니다.socat
.
socat \
pty,rawer,echo=0,link=/tmp/portA \
pty,rawer,echo=0,link=/tmp/portB
이렇게 하면 두 개의 PTY 장치와 이러한 장치에 대한 두 개의 심볼릭 링크가 생성됩니다. 내 시스템에서 위 명령은 다음을 생성합니다.
$ ls -l /tmp/port*
lrwxrwxrwx 1 lars lars 11 Jul 24 11:49 /tmp/portA -> /dev/pts/20
lrwxrwxrwx 1 lars lars 11 Jul 24 11:49 /tmp/portB -> /dev/pts/21
이러한 pty 장치를 직렬 포트로 생각할 수 있습니다. 예를 들어, slcand
다음 장치에 연결하여 CANbus 인터페이스를 생성할 수 있습니다.
slcand -o -c -f -s6 $(readlink /tmp/portA)
slcand -o -c -f -s6 $(readlink /tmp/portB)
아니면 picocom
각 포트에 연결하고 가상 링크를 통해 채팅할 수도 있습니다. 한 창에서:
picocom $(readlink /tmp/portA)
다른 창에서:
picocom $(readlink /tmp/portB)
등.
UNIX-98 pty와 BSD 스타일 pty는 동일하게 작동합니다. 차이점은 할당 방법에 있습니다(UNIX-98 pty는 동적으로 할당되는 반면 BSD 스타일 pty는 사전 할당된 장치입니다).
그러나 후속 grantpt() 및 Unlockpt() 후에도 클라이언트에는 pty에 대한 /dev/pts 장치만 제공할 수 있으며 마스터는 실행 파일 내부의 파일 설명자일 뿐입니다.
이는 올바른 것입니다. 두 개의 pty를 연결하여 가상 직렬 회선을 생성하려면 코드에서 두 pty 장치를 모두 연 다음 둘 사이의 데이터 이동을 처리해야 합니다( socat
위 예제에서 수행된 작업).