Cómo alojar una aplicación de consola moderna en un dispositivo COM serie heredado en Windows

0

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?

TheHansinator
fuente
"Me permite tener un puerto COM abierto". Estoy 100% seguro de que es falso. Acabo de terminar de trabajar en un proyecto en el que estaba abriendo varios puertos COM en una sola máquina utilizando Putty e internamente dentro del proyecto.
Ramhound
@Ramhound Puedo abrir múltiples puertos COM fácilmente. Simplemente no puedo tener el mismo El puerto COM está abierto con más de un identificador de archivo, y no he encontrado ningún conjunto de software que pueda comunicarse bidireccionalmente, con el puerto COM puede enviar y recibir datos de un programa externo.
TheHansinator
Eso es correcto y es de esperar ...
Ramhound
@Ramhound. Sí. Pero estas aplicaciones terminales como PuTTY y RealTerm están haciendo algo para habilitar la comunicación bidireccional con el puerto COM (aunque en la dirección incorrecta). Mi pregunta es, ¿cómo lo consigo en la dirección correcta?
TheHansinator
¿Cómo se puede conectar una conexión COM bidireccional en la dirección incorrecta? ¿Cómo puede una conexión COM no ser bidireccional, las conexiones COM seriales deben unirse en ambos sentidos para que funcionen?
Ramhound

Respuestas:

1

Editar: "Re-contestó" después de la aclaración de la pregunta

De acuerdo a Microsoft (No puedo encontrar Using command redirection operators sección para Windows más reciente que XP):

Manijas duplicadas

El & amp; El operador de redirección duplica la salida o entrada de un identificador especificado a otro identificador especificado. Por ejemplo, para enviar una salida dir a File.txt y enviar la salida de error a File.txt, escriba:

dir & gt; c: \ file.txt 2 & gt; & amp; 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 tienen acceso de solo escritura. No puede duplicar un identificador con acceso de solo lectura en un identificador con acceso de solo escritura.

Así que la buena noticia es:

  • Tu puedes cambiar <COM4 >COM4 2>COM4 a <COM4 >&1 2>&1.

Las malas noticias son:

  • Estás mezclando solo lectura <COM4 y solo escritura >&1 2>&1 Maneja los requisitos de acceso y estás cambiando. Access Denied a The 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 uso STDOUT y STDERR, pero STDIN Todavía parece estar roto. (*) He hecho algunas pruebas, pero parece que STDIN no trabajes

Sin embargo puedo ver una solución para solucionarlo:

  • Utilizar com0com emulador de modem nulo y define 3 pares de puertos virtuales:
    • COM_O - COM_O4 para STDOUT;
    • COM_E - COM_E4 para STDERR;
    • COM_I - COM_I4 para STDIN.
  • Hacer un hub serie con hub4com.exe ( com0com parte desde COM_O4, COM_E4, COM_I4 y 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 (usted es el propietario): --baud...
  • Y <\\.\COM_I >\\.\COM_O 2>\\.\COM_E forma de 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 linea de comando de Windows en COM4 en 19200 8N1...

g2mk
fuente
Lo siento, debería haber sido más claro, he editado la publicación. El mismo problema también ocurre con 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í.
TheHansinator
@ Compynerd255 He actualizado la respuesta un poco ...
g2mk
Muchas gracias - esto parece prometedor. Sin embargo, ¿crees que podrías dilucidar qué comandos estás usando para crear el hub? No puedo hacer que el hub funcione con un puerto de prueba adicional.
TheHansinator
@ Compynerd255 Extended con el comando hub4com ...
g2mk
@ Compynerd255 ¿Está funcionando para usted?
g2mk