EDITAR: Se cambió el ejemplo principal de Zork Dungeon al shell predeterminado del sistema operativo.
Tengo una aplicación de consola que se ejecuta en una máquina moderna. También tengo un Apple // e con una tarjeta Super Serial, que le permite funcionar como un terminal tonto a través de una conexión COM en serie (los detalles no sirven para nada más que eso). Puedo conectar estos dos dispositivos bien usando un puerto serial USB.
Cuando la máquina moderna ha arrancado Linux, al configurar los ajustes de COM y darme derechos al grupo al que pertenece el archivo del dispositivo, puedo ejecutar
$ bash </dev/ttyUSB1 >/dev/ttyUSB1 2>/dev/ttyUSB1
y obtenga una sesión de bash en Apple: la máquina Linux actúa como servidor y ejecuta el programa, pero la entrada y la salida van a Apple, que es un cliente simple. Esto también funciona con programas más dedicados, tales como dungeon
(Zork).
¿Cómo hago lo mismo en Windows? Obviamente, no puedo replicar la solución anterior exactamente porque Windows solo me permite tener una COM
puerto abierto en un lugar a la vez, ejecutando el análogo de Windows del comando anterior,
C:\> cmd <COM4 >COM4 2>COM4
me da un error de Acceso Denegado
Puedo enviar datos al puerto COM:
C:\> echo "Hello" >COM4
y lea la entrada sin procesar (incluidos los caracteres de control y escape) desde el puerto COM:
C:\> type <COM4
pero no puedo hacer ambas cosas al mismo tiempo, en el mismo proceso o en procesos separados.
Intenté usar PuTTY y RealTerm, pero ambos solo me permiten operar Apple desde la máquina de Windows, lo que prueba que la conexión funciona pero es exactamente la dirección opuesta a la que quiero. ¿Cómo puedo alojar una aplicación de consola de Windows para acceder desde un terminal conectado?
fuente
Respuestas:
De acuerdo a Microsoft (No puedo encontrar
Using command redirection operators
sección para Windows más reciente que XP):Así que la buena noticia es:
<COM4 >COM4 2>COM4
a<COM4 >&1 2>&1
.Las malas noticias son:
<COM4
y solo escritura>&1 2>&1
Maneja los requisitos de acceso y estás cambiando.Access Denied
aThe handle could not be duplicated during redirection of handle 1
.Si cambias:
<COM4 >&1 2>&1
a>COM4 2>&1 <&1
(de solo lectura y de solo escritura aún se mezclan) que funciona y le da usoSTDOUT
ySTDERR
, peroSTDIN
Todavía parece estar roto. (*) He hecho algunas pruebas, pero parece queSTDIN
no trabajesSin embargo puedo ver una solución para solucionarlo:
com0com
emulador de modem nulo y define 3 pares de puertos virtuales:COM_O
-COM_O4
paraSTDOUT
;COM_E
-COM_E4
paraSTDERR
;COM_I
-COM_I4
paraSTDIN
.Hacer un hub serie con
hub4com.exe
(com0com
parte desdeCOM_O4
,COM_E4
,COM_I4
yCOM4
: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
...Y
<\\.\COM_I >\\.\COM_O 2>\\.\COM_E
forma de línea de comandos.Finalmente, para:
y:
tienes una linea de comando de Windows en
COM4
en19200 8N1
...fuente
cmd
y otros programas que se ejecutan en el indicador de comando de Windows muy bien, y eso es lo que estoy tratando de lograr aquí.