
EDITAR:Se cambió el ejemplo principal de Zork Dungeon al shell del sistema operativo predeterminado.
Tengo una aplicación de consola ejecutándose 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 serial (los detalles son inútiles más allá de eso). Puedo conectar estos dos dispositivos perfectamente usando un puerto serie USB.
Cuando la máquina moderna tiene Linux arrancado, al configurar los ajustes COM y otorgarme 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 bash en Apple: la máquina Linux actúa como servidor y ejecuta el programa, pero la entrada y salida van a Apple, que es un cliente simple. Esto también funciona con programas más dedicados, como dungeon
(Zork).
¿Cómo hago lo mismo en Windows? Obviamente, no puedo replicar la solución anterior exactamente ya que Windows solo me permite tener un 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 formato (¡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 permitieron operar Apple desde la máquina con Windows, lo que demuestra que la conexión funciona pero es exactamente la dirección opuesta a lo que quiero. ¿Cómo alojo una aplicación de consola de Windows para acceder desde un terminal conectado?
Respuesta1
Editar:"Rerespondido" después de aclarar la pregunta
De acuerdo amicrosoft(No puedo encontrar Using command redirection operators
la sección para Windows más reciente que XP):
Duplicar manijas
El operador de redirección & duplica la salida o entrada de un identificador especificado a otro identificador especificado. Por ejemplo, para enviar la salida del directorio a File.txt y enviar la salida del error a File.txt, escriba:
directorio>c:\archivo.txt 2>&1
Cuando duplica un identificador, duplica todas las características de la aparición original del identificador. Por ejemplo, si un identificador tiene acceso de solo escritura, todos los duplicados de ese identificador tendrán acceso de solo escritura. No puede duplicar un identificador con acceso de solo lectura en un identificador con acceso de solo escritura.
Entonces la buena noticia es:
- Puedes cambiar
<COM4 >COM4 2>COM4
a<COM4 >&1 2>&1
.
La mala noticia es:
- Está combinando requisitos de acceso de control de solo lectura
<COM4
y solo escritura>&1 2>&1
y está cambiandoAccess Denied
aThe handle could not be duplicated during redirection of handle 1
.
Si cambias:
<COM4 >&1 2>&1
a>COM4 2>&1 <&1
(solo lectura y solo escritura todavía están mezclados) que funciona y le brinda utilidadSTDOUT
ySTDERR
, peroSTDIN
todavía parece * estar roto. (*)He hecho algunas pruebas, pero parece queSTDIN
no funciona...
Sin embargo, puedo ver una solución para solucionarlo:
- Usar
com0com
emulador de módem nuloy defina 3 pares de puertos virtuales:COM_O
-COM_O4
paraSTDOUT
;COM_E
-COM_E4
paraSTDERR
;COM_I
-COM_I4
paraSTDIN
.
Haga un concentrador en serie con
hub4com.exe
(com0com
parte) deCOM_O4
,COM_E4
y :COM_I4
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
- Recuerde configurar los parámetros de transmisión adecuados (los suyos):
--baud
...
Y
<\\.\COM_I >\\.\COM_O 2>\\.\COM_E
forme la línea de comandos.
Finalmente, para:
hub4com.exe --route=0:1 --route=2,3:0 --octs=off \\.\COM4 \\.\COM_I4 \\.\COM_E4 \\.\COM_O4
y:
cmd <\\.\COM_I >\\.\COM_O 2>\\.\COM_E
tienes una línea de comandos de Windows activada COM4
en 19200 8N1
...