[linux] Linux 용 가상 직렬 포트

Linux에서 직렬 포트 응용 프로그램을 테스트해야하지만 내 테스트 컴퓨터에는 직렬 포트가 하나만 있습니다.

Linux에 가상 직렬 포트를 추가하고 셸 또는 스크립트를 통해 장치를 에뮬레이션하여 내 애플리케이션을 테스트하는 방법이 있습니까?

참고 : 포트를 다시 매핑 할 수 없으며 ttys2에서 하드 코딩되었으며 작성된대로 애플리케이션을 테스트해야합니다.



답변

이를 위해 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


답변

@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”라는 문자열이 표시됩니다.


답변

이를 위해 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는 첫 번째 명령에서 인쇄 된 장치입니다.

그리고 그게 다야. 두 프로세스 사이에 양방향 링크가 있습니다.

이 예제를 사용하면 모든 종류의 데이터를 전송하여 애플리케이션을 테스트하고 제대로 작동하는지 확인할 수 있습니다.

또한 항상 장치를 심볼릭 링크 할 수 있으므로 테스트중인 응용 프로그램을 다시 컴파일 할 필요가 없습니다.


답변

USB-> RS232 어댑터를 사용할 수 있습니까? 나는 몇 가지가 있고 그들은 FTDI 드라이버를 사용합니다. 그런 다음 / dev / ttyUSB0 (또는 생성되는 모든 항목)의 이름을 / dev / ttyS2로 바꿀 수 있습니다.