Linux 용 가상 직렬 포트


128

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

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

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

답변:


75

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


8
Linux에서는 openpty / forkpty 시스템 호출을 사용할 수 있습니다. 참조 맨 페이지를
매튜 스미스

8
명령 줄 도구를 사용하여 가상 직렬 포트 쌍을 만드는 방법은 무엇입니까?
linjunhalida 2010 년

8
전송 속도, 패리티, hw 흐름 제어, 문자 크기 (?)와 같은 많은 직렬 포트 매개 변수는 pty로 구현되지 않으므로 직렬 전송 오류가있는 경우 응용 프로그램을 테스트 할 수 없습니다.
Dima Tisnek 2012

10
이것은 도움이되지만 "이전 스타일"BSD 의사 터미널을 설명합니다. "새로운 스타일"UNIX 98 의사 터미널은 약간 다르게 작동합니다 . 자세한 내용 은 ptsman 페이지 를 참조하십시오.
Craig McQueen

3
@LaszloPapp 나는 전체 시간을 거짓말, 사과 않습니다
매튜 스미스

160

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


이것은 가상 COM 포트 파일에 자동 할당되고 에코가 없기 때문에 slonik의 대답보다 더 잘 작동했습니다.
gbmhunter 2014 년

7
재현 가능한 파일 이름을 원하는 경우 link=/path/to/link각 장치 선언 후 (echo = 0 이후). 따라서 자동화 된 테스트에 사용할 수 있습니다. (slonik이 답변에서 한 것처럼)
Patrick B.

이것은 언급 한대로 정확히 작동했습니다. 감사합니다.
nim118

1
실제 직렬 포트에 연결되는 pty를 만들려면 : socat -d -d pty,raw,echo=0 /dev/ttyUSB5,raw,echo=0.
Penghe Geng

/dev/ttyS0대신 같은 이름으로 직렬 포트를 만들 수 /dev/pts/1있습니까?
mrid

48

이를 위해 socat을 사용하십시오.

예를 들면 :

socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11

이것은 나를 위해 잘 작동했으며 minicom으로 테스트되었습니다! 하나의 터미널에 대한 입력이 양쪽 모두에 에코되는 것처럼 보입니다 (따라서 입력 터미널에도 다시 나타납니다).
gbmhunter 2014 년

1
동일한 에코 동작이 없습니다. minicom에는 "로컬 에코"기능이 있습니다.하지만 비활성화되면 실제 직렬 포트와 똑같이 작동합니다. 팁 고마워.
cptHammer

16

리눅스 용 실제 널 모뎀 에뮬레이터 인 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를 사용하여 직접 핀을 관리 할 것이기 때문에 필요하지 않습니다.

내 버전의 코드에 관심이있는 사람이 있다면 메시지를 보내 주시면 보내 드리겠습니다.


2
귀하의 코드를보고 싶습니다. tty0tty 프로젝트에 다시 기여할 수 있습니까? 그러나 사람들이 리눅스 커널에서 의사 터미널 코드를 개선하는 것을보고 싶습니다. 예를 들어 하드웨어 핸드 셰이 킹 지원 및 TIOCMIWAIT를 추가합니다.
Craig McQueen 2013 년

3
"누군가가 내 버전의 코드에 관심이있는 경우 메시지를 보내 주시면 보내 드리겠습니다." 네, 관심이 있습니다! 예를 들어 GitHub에서 어딘가에 가리킬 수 있습니까?
Craig McQueen 2013

7
드라이버를 github.com/pitti98/nullmodem에 업로드했습니다 . 답장하는 데 너무 오래 걸렸습니다. 나는 stackoverflow에서별로 활동적이지 않으며 귀하의 의견을 간과했습니다!
Peter Remmers

아니요, 필요했기 때문에 썼고 원하는 일을 할 수있을만큼 충분하면 중단했습니다. 이제 공개되었으므로 다른 사람에게 유용하기를 바라며, 누군가 내가 남겨둔 곳을 선택했을 수도 있습니다.
Peter Remmers

8

커널 드라이버를 사용하여 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"아래에 있습니다 .


6

이전 답변에 게시 된 링크를 사용하여 가상 직렬 포트를 사용하여 C ++로 약간의 예제를 코딩했습니다. 코드를 GitHub : https://github.com/cymait/virtual-serial-port-example에 푸시했습니다 .

코드는 자명합니다. 먼저 ./main master를 실행하여 마스터 프로세스를 생성하면 장치가 사용중인 stderr로 인쇄됩니다. 그런 다음 ./main 슬레이브 장치를 호출합니다. 여기서 device는 첫 번째 명령에서 인쇄 된 장치입니다.

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

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

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


1
while (read (fd, & inputbyte, 1) == 1) {...} read는 코드에 정의되어 있지 않습니다. 쓰기가 정의되지 않았습니다. 닫기가 정의되지 않았습니다.
Mattis Asp

4

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


4

세 가지 옵션을 생각할 수 있습니다.

RFC 2217 구현

RFC 2217 은 한 시스템의 클라이언트가 로컬 프로그램에 대한 직렬 포트를 에뮬레이트하는 동시에 실제로 직렬 포트가있는 다른 시스템의 서버에 데이터 및 제어 신호를 투명하게 보내고받을 수 있도록하는 TCP / IP 표준에 대한 com 포트를 포함합니다. 다음은 개략적 인 개요 입니다.

당신이 할 일은 PC에서 시스템의 클라이언트 측을 구현하는 클라이언트 com 포트 드라이버를 찾거나 구현하는 것입니다. 실제 직렬 포트처럼 보이지만 실제로는 모든 것을 서버로 전송합니다. 실제 독립형 직렬 포트 서버를 지원하기 위해 Digi, Lantronix 등에서이 드라이버를 무료로 얻을 수 있습니다.

그런 다음 연결의 서버 측을 다른 프로그램에서 로컬로 구현하여 클라이언트가 필요에 따라 데이터 및 제어 명령을 연결하고 실행할 수 있도록합니다.

사소하지 않을 수도 있지만 RFC가 외부에 있으며 연결의 한쪽 또는 양쪽을 구현하는 오픈 소스 프로젝트를 찾을 수 있습니다.

Linux 직렬 포트 드라이버 수정

또는 Linux 용 직렬 포트 드라이버 소스를 즉시 사용할 수 있습니다. 그것을 취하고, 하드웨어 컨트롤 피스를 내장하고, 그 하나의 드라이버가 2 개의 / dev / ttySx 포트를 실행하게하세요. 그런 다음 실제 프로그램을 ttyS2에 연결하고 시뮬레이터를 다른 ttySx에 연결합니다.

루프백에 두 개의 USB <-> 직렬 케이블 사용

하지만 지금 당장 할 수있는 가장 쉬운 일은? 두 개의 직렬 포트 USB 장치에 40 달러를 지출하고 함께 연결하고 (널 모뎀) 실제로 두 개의 실제 직렬 포트가 있습니다. 하나는 테스트중인 프로그램 용이고 하나는 시뮬레이터 용입니다.

-아담


1
실제로 널 모뎀 USB UART 케이블은 로컬 테스트 (포트가 부족한 경우 USB 허브 가져 오기)와 원격 디버깅을 모두 지원하므로 나에게 매우 우아한 솔루션처럼 보입니다.
Maxthon Chan

품질을 검토하지는 않았지만 ttynvt 는 Linux FUSE를 통해 RFC 2217을 구현합니다
Daniel Santos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.