답변:
이를 위해 pty ( "pseudo-teletype", 직렬 포트는 "real teletype")를 사용할 수 있습니다. 한쪽에서을 열고 /dev/ptyp5
프로그램을 /dev/ttyp5
; ttyp5
직렬 포트처럼 작동하지만 / dev / ptyp5를 통해 수행하는 모든 작업을 송수신합니다.
라는 파일과 통신하는 데 정말로 필요하다면 이전 파일을 /dev/ttys2
이동 /dev/ttys2
하고에서 ptyp5
로 심볼릭 링크를 만드십시오 ttys2
.
물론 ptyp5
. 모든 로그인 터미널도 pty를 사용하기 때문에 중복을 피하기 위해 높은 숫자를 가진 것을 선택하십시오.
Wikipedia에는 pty에 대한 자세한 내용이 있습니다. http://en.wikipedia.org/wiki/Pseudo_terminal
pts
man 페이지 를 참조하십시오.
@slonik의 대답을 보완합니다.
다음 절차를 수행하여 가상 직렬 포트를 생성하기 위해 socat을 테스트 할 수 있습니다 (Ubuntu 12.04에서 테스트 됨).
터미널을 열고 (터미널 0이라고합시다) 실행합니다 :
socat -d -d pty,raw,echo=0 pty,raw,echo=0
위의 코드는 다음을 반환합니다.
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/2
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/3
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs [3,3] and [5,5]
다른 터미널을 열고 (터미널 1)을 작성하십시오.
cat < /dev/pts/2
이 명령의 포트 이름은 pc에 따라 변경할 수 있습니다. 이전 출력에 따라 다릅니다.
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**2**
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**3**
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs
강조 표시된 영역에있는 번호를 사용해야합니다.
다른 터미널을 열고 (터미널 2)를 작성하십시오.
echo "Test" > /dev/pts/3
이제 터미널 1로 돌아 가면 "Test"라는 문자열이 표시됩니다.
link=/path/to/link
각 장치 선언 후 (echo = 0 이후). 따라서 자동화 된 테스트에 사용할 수 있습니다. (slonik이 답변에서 한 것처럼)
socat -d -d pty,raw,echo=0 /dev/ttyUSB5,raw,echo=0
.
/dev/ttyS0
대신 같은 이름으로 직렬 포트를 만들 수 /dev/pts/1
있습니까?
이를 위해 socat을 사용하십시오.
예를 들면 :
socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11
리눅스 용 실제 널 모뎀 에뮬레이터 인 tty0tty http://sourceforge.net/projects/tty0tty/ 도 있습니다 .
간단한 커널 모듈-작은 소스 파일입니다. 나는 그것이 왜 sourceforge에서 엄지 손가락을 내리는 지 모르겠지만 나에게는 잘 작동합니다. 가장 좋은 점은 하드웨어 핀 (RTC / CTS DSR / DTR)을 에뮬레이트한다는 것입니다. TIOCMGET / TIOCMSET 및 TIOCMIWAIT iotcl 명령도 구현합니다!
최근 커널에서는 컴파일 오류가 발생할 수 있습니다. 이것은 고치기 쉽습니다. module / tty0tty.c 소스의 맨 위에 몇 줄을 삽입하기 만하면됩니다 (포함 후).
#ifndef init_MUTEX
#define init_MUTEX(x) sema_init((x),1)
#endif
모듈이로드되면 4 쌍의 직렬 포트를 생성합니다. 장치는 / dev / tnt0에서 / dev / tnt7까지입니다. 여기서 tnt0은 tnt1에 연결되고 tnt2는 tnt3에 연결됩니다. 장치를 사용하려면 파일 권한을 수정해야 할 수 있습니다.
편집하다:
나는 열정에 조금 빠르다고 생각합니다. 운전자는 유망 해 보이지만 불안정 해 보입니다. 확실하지는 않지만 집에서 작업하던 사무실의 기계가 고장난 것 같습니다. 월요일에 사무실에 돌아올 때까지 확인할 수 없습니다.
두 번째는 TIOCMIWAIT가 작동하지 않는다는 것입니다. 코드는 "작은 tty"예제 코드에서 복사 된 것 같습니다. TIOCMIWAIT 처리가 제자리에있는 것처럼 보이지만 wake_up_interruptible ()에 대한 해당 호출이 없기 때문에 깨어나지 않습니다.
편집하다:
사무실에서의 사고는 정말로 운전자의 잘못이었습니다. 초기화가 누락되었으며 완전히 테스트되지 않은 TIOCMIWAIT 코드로 인해 시스템이 중단되었습니다.
어제와 오늘은 드라이버를 다시 작성했습니다. 많은 문제가 있었지만 이제는 잘 작동합니다. 드라이버가 관리하는 하드웨어 흐름 제어를위한 코드가 여전히 누락되어 있지만 사용자 모드 코드에서 TIOCMGET / TIOCMSET / TIOCMIWAIT를 사용하여 직접 핀을 관리 할 것이기 때문에 필요하지 않습니다.
내 버전의 코드에 관심이있는 사람이 있다면 메시지를 보내 주시면 보내 드리겠습니다.
커널 드라이버를 사용하여 Linux 가상 직렬 포트를 생성하기 위해 Tibbo VSPDL 을 살펴볼 수 있습니다. 상당히 새롭고 지금 다운로드 할 수 있습니다 (베타 버전). 이 시점에서 라이선스에 대해 또는 향후에만 상업적으로 사용할 수 있도록 할 것인지 확실하지 않습니다.
http://www.ttyredirector.com/ 과 같은 다른 상업적 대안이 있습니다 .
오픈 소스에서 Remserial (GPL)은 Unix PTY를 사용하여 원하는 작업을 수행 할 수도 있습니다. 직렬 데이터를 "원시 형태"로 네트워크 소켓으로 전송합니다. 포트를 생성 할 때 STTY와 같은 터미널 매개 변수 설정을 수행해야합니다. 나중에 RFC 2217에 설명 된대로 변경하는 것은 지원되지 않는 것 같습니다. 포트 속도 등을 미리 설정해야한다는 점을 제외하고 com0com과 같은 가상 널 모뎀을 생성하기 위해 두 개의 잔여 인스턴스를 실행할 수 있어야합니다.
Socat (GPL이라고도 함)은 PTY를 Socat의 다른 인스턴스가 될 수있는 다른 것으로 리디렉션하는 "PTY"방법을 포함하여 더 많은 옵션이있는 Remserial의 확장 된 변형과 같습니다. Unit tets의 경우 파일을 PTY에 직접 cat 수 있기 때문에 socat이 remserial보다 좋을 것입니다. 맨 페이지 의 PTY 예제 를 참조하십시오 . 직렬 회선 설정 협상을위한 RFC2217 지원을 제공 하는 패치가 "contrib"아래에 있습니다 .
이전 답변에 게시 된 링크를 사용하여 가상 직렬 포트를 사용하여 C ++로 약간의 예제를 코딩했습니다. 코드를 GitHub : https://github.com/cymait/virtual-serial-port-example에 푸시했습니다 .
코드는 자명합니다. 먼저 ./main master를 실행하여 마스터 프로세스를 생성하면 장치가 사용중인 stderr로 인쇄됩니다. 그런 다음 ./main 슬레이브 장치를 호출합니다. 여기서 device는 첫 번째 명령에서 인쇄 된 장치입니다.
그리고 그게 다야. 두 프로세스 사이에 양방향 링크가 있습니다.
이 예제를 사용하면 모든 종류의 데이터를 전송하여 애플리케이션을 테스트하고 제대로 작동하는지 확인할 수 있습니다.
또한 항상 장치를 심볼릭 링크 할 수 있으므로 테스트중인 응용 프로그램을 다시 컴파일 할 필요가 없습니다.
세 가지 옵션을 생각할 수 있습니다.
RFC 2217 은 한 시스템의 클라이언트가 로컬 프로그램에 대한 직렬 포트를 에뮬레이트하는 동시에 실제로 직렬 포트가있는 다른 시스템의 서버에 데이터 및 제어 신호를 투명하게 보내고받을 수 있도록하는 TCP / IP 표준에 대한 com 포트를 포함합니다. 다음은 개략적 인 개요 입니다.
당신이 할 일은 PC에서 시스템의 클라이언트 측을 구현하는 클라이언트 com 포트 드라이버를 찾거나 구현하는 것입니다. 실제 직렬 포트처럼 보이지만 실제로는 모든 것을 서버로 전송합니다. 실제 독립형 직렬 포트 서버를 지원하기 위해 Digi, Lantronix 등에서이 드라이버를 무료로 얻을 수 있습니다.
그런 다음 연결의 서버 측을 다른 프로그램에서 로컬로 구현하여 클라이언트가 필요에 따라 데이터 및 제어 명령을 연결하고 실행할 수 있도록합니다.
사소하지 않을 수도 있지만 RFC가 외부에 있으며 연결의 한쪽 또는 양쪽을 구현하는 오픈 소스 프로젝트를 찾을 수 있습니다.
또는 Linux 용 직렬 포트 드라이버 소스를 즉시 사용할 수 있습니다. 그것을 취하고, 하드웨어 컨트롤 피스를 내장하고, 그 하나의 드라이버가 2 개의 / dev / ttySx 포트를 실행하게하세요. 그런 다음 실제 프로그램을 ttyS2에 연결하고 시뮬레이터를 다른 ttySx에 연결합니다.
하지만 지금 당장 할 수있는 가장 쉬운 일은? 두 개의 직렬 포트 USB 장치에 40 달러를 지출하고 함께 연결하고 (널 모뎀) 실제로 두 개의 실제 직렬 포트가 있습니다. 하나는 테스트중인 프로그램 용이고 하나는 시뮬레이터 용입니다.
-아담