Windows의 레거시 직렬 COM 장치에서 최신 콘솔 응용 프로그램을 호스팅하는 방법

Windows의 레거시 직렬 COM 장치에서 최신 콘솔 응용 프로그램을 호스팅하는 방법

편집하다:기본 예제를 Zork Dungeon에서 기본 OS 셸로 변경했습니다.

최신 컴퓨터에서 실행되는 콘솔 응용 프로그램이 있습니다. 나는 또한 직렬 COM 연결을 통해 단순 터미널로 작동할 수 있는 슈퍼 직렬 카드가 있는 Apple //e를 가지고 있습니다(자세한 내용은 그 이상은 쓸모가 없습니다). USB 직렬 포트를 사용하면 이 두 장치를 제대로 연결할 수 있습니다.

최신 시스템에서 Linux를 부팅하면 COM 설정을 구성하고 장치 파일이 속한 그룹에 대한 권한을 나에게 부여하여 다음을 실행할 수 있습니다.

$ bash </dev/ttyUSB1 >/dev/ttyUSB1 2>/dev/ttyUSB1

Apple에서 bash 세션을 얻습니다. Linux 시스템은 서버 역할을 하고 프로그램을 실행하지만 입력 및 출력은 간단한 클라이언트인 Apple로 이동합니다. 이는 dungeon(Zork) 와 같은 보다 전용 프로그램에서도 작동합니다 .

Windows에서 동일한 작업을 어떻게 수행합니까? 분명히 Windows에서는 한 번에 한 위치에서만 포트를 열 수 있으므로 위의 솔루션을 정확하게 복제할 수는 없습니다. COM위 명령의 Windows 아날로그를 실행하면

C:\> cmd <COM4 >COM4 2>COM4

액세스 거부 오류가 발생합니다.

COM 포트로 데이터를 보낼 수 있습니다.

C:\> echo "Hello" >COM4

COM 포트에서 원시 입력(제어 및 이스케이프 문자 포함!)을 읽습니다.

C:\> type <COM4

하지만 동시에, 동일하거나 별도의 프로세스에서 두 가지를 모두 수행할 수는 없습니다.

저는 PuTTY와 RealTerm을 사용해 보았으나 둘 다 Windows 시스템에서만 Apple을 작동할 수 있었습니다. 이는 연결이 작동한다는 것을 증명했지만 제가 원하는 것과 정확히 반대 방향이었습니다. 연결된 터미널에서 액세스할 수 있도록 Windows 콘솔 애플리케이션을 호스팅하려면 어떻게 해야 합니까?

답변1

편집하다:질문 설명 후 "재답변"

에 따르면마이크로소프트Using command redirection operators( XP보다 최신 Windows에 대한 섹션을 찾을 수 없습니다 ):

핸들 복제

& 리디렉션 연산자는 지정된 한 핸들의 출력 또는 입력을 지정된 다른 핸들로 복제합니다. 예를 들어 dir 출력을 File.txt로 보내고 오류 출력을 File.txt로 보내려면 다음을 입력합니다.

디렉토리>c:\file.txt 2>&1

핸들을 복제하면 원래 핸들 발생의 모든 특성이 복제됩니다. 예를 들어 핸들에 쓰기 전용 액세스 권한이 있는 경우 해당 핸들의 모든 복제본에는 쓰기 전용 액세스 권한이 있습니다. 읽기 전용 액세스 권한이 있는 핸들을 쓰기 전용 액세스 권한이 있는 핸들에 복제할 수 없습니다.

좋은 소식은 다음과 같습니다.

  • <COM4 >COM4 2>COM4으로 변경할 수 있습니다 <COM4 >&1 2>&1.

나쁜 소식은 다음과 같습니다.

  • 읽기 전용 <COM4및 쓰기 전용 핸들 액세스 요구 사항을 혼합하고 있으며 으로 >&1 2>&1변경하고 있습니다 .Access DeniedThe handle could not be duplicated during redirection of handle 1

변경하는 경우:

  • <COM4 >&1 2>&1to >COM4 2>&1 <&1(읽기 전용과 쓰기 전용이 여전히 혼합되어 있음) 작동하고 사용할 수 있는 STDOUT및 을 제공 STDERR하지만 STDIN여전히 손상된 것 같습니다*. (*)몇 가지 테스트를 해봤지만 STDIN안되는 것 같습니다...

그러나 이를 해결하기 위한 한 가지 해결 방법을 볼 수 있습니다.

  • 사용com0com널 모뎀 에뮬레이터3개의 가상 포트 쌍을 정의합니다.
    • COM_O- 을 COM_O4위한 STDOUT;
    • COM_E- 을 COM_E4위한 STDERR;
    • COM_I- 을 COM_I4위한 STDIN.
  • , 및 : 의 hub4com.exe( com0com부분)을 사용하여 직렬 허브를 만듭니다 .COM_O4COM_E4COM_I4COM4

    • hub4com.exe --route=0:1 --route=2,3:0 --baud=19200 --data=8 --parity=no --stop=1 --octs=off --odsr=off --ox=off --ix=off --idsr=off --ito=0 \\.\COM4 \\.\COM_I4 \\.\COM_E4 \\.\COM_O4
    • 적절한(귀하가 소유한) 전송 매개변수를 설정하는 것을 기억하십시오: --baud...
  • 그리고 <\\.\COM_I >\\.\COM_O 2>\\.\COM_E명령줄을 구성합니다.


마지막으로:

hub4com.exe --route=0:1 --route=2,3:0 --octs=off \\.\COM4 \\.\COM_I4 \\.\COM_E4 \\.\COM_O4

그리고:

cmd <\\.\COM_I >\\.\COM_O 2>\\.\COM_E

Windows 명령줄 COM4이 켜져 있습니다 19200 8N1.

관련 정보