So hosten Sie eine moderne Konsolenanwendung auf einem älteren seriellen COM-Gerät in Windows

So hosten Sie eine moderne Konsolenanwendung auf einem älteren seriellen COM-Gerät in Windows

BEARBEITEN:Primäres Beispiel von Zork Dungeon zur Standard-OS-Shell geändert.

Auf einem modernen Rechner läuft eine Konsolenanwendung. Außerdem habe ich ein Apple //e mit einer Super Serial Card, die es ermöglicht, es über eine serielle COM-Verbindung als einfaches Terminal zu verwenden (weitere Details sind nutzlos). Ich kann diese beiden Geräte problemlos über einen USB-Seriell-Port verbinden.

Wenn auf der modernen Maschine Linux gebootet ist, kann ich durch Konfigurieren der COM-Einstellungen und Einräumen von Rechten für die Gruppe, zu der die Gerätedatei gehört, Folgendes ausführen:

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

und führe eine Bash-Sitzung auf dem Apple aus - die Linux-Maschine fungiert als Server und führt das Programm aus, aber Eingabe und Ausgabe gehen an den Apple, der ein einfacher Client ist. Dies funktioniert auch mit dedizierteren Programmen wie dungeon(Zork).

Wie mache ich das Gleiche unter Windows? Offensichtlich kann ich die obige Lösung nicht exakt nachbilden, da ich unter Windows immer nur einen COMPort gleichzeitig öffnen kann. Dazu führe ich das Windows-Äquivalent des obigen Befehls aus.

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

gibt mir einen Zugriffsverweigerungsfehler aus.

Ich kann Daten an den COM-Port senden:

C:\> echo "Hello" >COM4

und lesen Sie die Roheingabe (einschließlich Steuer- und Escapezeichen!) vom COM-Port:

C:\> type <COM4

Aber ich kann nicht beides gleichzeitig tun, weder im selben noch in getrennten Prozessen.

Ich habe versucht, PuTTY und RealTerm zu verwenden, aber mit beiden konnte ich den Apple nur von der Windows-Maschine aus bedienen, was zwar beweist, dass die Verbindung funktioniert, aber genau in die entgegengesetzte Richtung von dem geht, was ich möchte. Wie hoste ich eine Windows-Konsolenanwendung für den Zugriff von einem verbundenen Terminal aus?

Antwort1

Bearbeiten:"Erneut beantwortet" nach Klärung der Frage

EntsprechendMicrosoft(Ich kann keinen Using command redirection operatorsAbschnitt für Windows neuer als XP finden):

Griffe duplizieren

Der Umleitungsoperator & dupliziert die Ausgabe oder Eingabe von einem angegebenen Handle zu einem anderen angegebenen Handle. Um beispielsweise die Dir-Ausgabe an File.txt und die Fehlerausgabe an File.txt zu senden, geben Sie Folgendes ein:

dir>c:\datei.txt 2>&1

Wenn Sie einen Handle duplizieren, duplizieren Sie alle Merkmale des ursprünglichen Vorkommens des Handles. Wenn ein Handle beispielsweise nur Schreibzugriff hat, haben alle Duplikate dieses Handles nur Schreibzugriff. Sie können einen Handle mit schreibgeschütztem Zugriff nicht in einen Handle mit schreibgeschütztem Zugriff duplizieren.

Die gute Nachricht ist:

  • Sie können <COM4 >COM4 2>COM4zu wechseln <COM4 >&1 2>&1.

Die schlechte Nachricht ist:

  • Sie mischen Anforderungen für den schreibgeschützten <COM4und schreibgeschützten >&1 2>&1Handle-Zugriff und wechseln Access Deniedzu The handle could not be duplicated during redirection of handle 1.

Wenn Sie Folgendes ändern:

  • <COM4 >&1 2>&1zu >COM4 2>&1 <&1(schreibgeschützt und schreibgeschützt sind immer noch gemischt), was funktioniert und Ihnen verwendbare STDOUTund gibt STDERR, aber STDINimmer noch* kaputt zu sein scheint. (*)Ich habe einige Tests durchgeführt, aber es scheint, dass es STDINnicht funktioniert ...

Ich sehe jedoch einen Workaround zur Behebung des Problems:

  • Verwendencom0comNullmodem-Emulatorund definieren Sie 3 virtuelle Portpaare:
    • COM_O- COM_O4für STDOUT;
    • COM_E- COM_E4für STDERR;
    • COM_I- COM_I4für STDIN.
  • Erstellen Sie einen seriellen Hub mit hub4com.exe( com0comTeil) aus COM_O4, COM_E4, COM_I4und COM4:

    • 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
    • Denken Sie daran, die richtigen (Ihre eigenen) Übertragungsparameter einzurichten: --baud...
  • Und <\\.\COM_I >\\.\COM_O 2>\\.\COM_Ebilden Sie eine Befehlszeile.


Und schließlich:

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

Und:

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

Sie haben eine Windows-Befehlszeile COM4aktiviert 19200 8N1...

verwandte Informationen