문제

Linux에서 직렬 포트 애플리케이션을 테스트해야 하는데 테스트 시스템에 직렬 포트가 하나만 있습니다.

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

메모:포트를 다시 매핑할 수 없습니다. 포트는 ttys2에 하드 코딩되어 있으므로 작성된 애플리케이션을 테스트해야 합니다.

도움이 되었습니까?

해결책

이를 위해 pty(직렬 포트가 "실제 텔레타이프"인 경우 "의사 텔레타이프")를 사용할 수 있습니다.한쪽 끝에서 열림 /dev/ptyp5, 을 클릭한 다음 프로그램을 /dev/ttyp5; ttyp5 직렬 포트처럼 작동하지만 /dev/ptyp5를 통해 수행하는 모든 작업을 보내고 받습니다.

다음과 같은 파일과 대화하는 데 정말로 필요한 경우 /dev/ttys2, 그런 다음 이전 /dev/ttys2 방해가되지 않는 곳에서 심볼릭 링크를 만드십시오. ptyp5 에게 ttys2.

물론 다른 번호를 사용해도 됩니다. ptyp5.모든 로그인 터미널도 ptys를 사용하므로 중복을 피하기 위해 숫자가 높은 것을 선택하십시오.

Wikipedia에는 ​​ptys에 대한 자세한 내용이 있습니다. 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/ 이는 Linux용 실제 널 모뎀 에뮬레이터입니다.

이것은 간단한 커널 모듈, 즉 작은 소스 파일입니다.왜 sourceforge에서만 거절을 받았는지 모르겠지만 나에게는 잘 작동합니다.가장 좋은 점은 하드웨어 핀(RTC/CTS DSR/DTR)도 에뮬레이션한다는 것입니다.TIOCMGET/TIOCMSET 및 TIOCMIWAIT iotcl 명령도 구현합니다!

최근 커널에서는 컴파일 오류가 발생할 수 있습니다.이 문제는 쉽게 해결할 수 있습니다.module/tty0tty.c 소스 상단(includes 뒤)에 몇 줄을 삽입하세요:

#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를 사용하여 직접 핀을 관리할 것이기 때문에 필요하지 않습니다.

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

당신은보고 싶을 수도 있습니다 티보 VSPDL 커널 드라이버를 사용하여 Linux 가상 직렬 포트를 생성하는 방법은 매우 새로운 것으로 보이며 현재 다운로드할 수 있습니다(베타 버전).현재 라이센스에 대해 확신할 수 없거나 향후에만 라이센스를 상업적으로 사용할 수 있도록 할 것인지 확실하지 않습니다.

다음과 같은 다른 상업적 대안이 있습니다. http://www.ttyredirector.com/.

오픈소스에서는 Remserial (GPL)은 Unix PTY를 사용하여 원하는 것을 수행할 수도 있습니다.이는 "원시 형식"의 직렬 데이터를 네트워크 소켓으로 전송합니다.STTY와 유사한 터미널 매개변수 설정은 포트를 생성할 때 수행되어야 하며 나중에 RFC 2217에 설명된 대로 변경하는 것은 지원되지 않는 것 같습니다.포트 속도 등을 미리 설정해야 한다는 점을 제외하면 com0com과 같은 가상 널모뎀을 생성하려면 두 개의 remserial 인스턴스를 실행할 수 있어야 합니다.

소캣 (또한 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 슬레이브 장치를 호출합니다. 여기서 장치는 첫 번째 명령에 인쇄된 장치입니다.

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

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

또한 언제든지 장치를 심볼릭 링크할 수 있으므로 테스트 중인 애플리케이션을 다시 컴파일할 필요가 없습니다.

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

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

RFC 2217 구현

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

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

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

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

Linux 직렬 포트 드라이버 수정

또는 Linux용 직렬 포트 드라이버 소스를 쉽게 사용할 수 있습니다.이를 받아들이고 하드웨어 제어 부품을 제거하고 하나의 드라이버가 간단한 루프백으로 두 개의 /dev/ttySx 포트를 실행하도록 하십시오.그런 다음 실제 프로그램을 ttyS2에 연결하고 시뮬레이터를 다른 ttySx에 연결하십시오.

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

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

-아담

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top