Como hospedar um aplicativo de console moderno em um dispositivo COM serial herdado no Windows

Como hospedar um aplicativo de console moderno em um dispositivo COM serial herdado no Windows

EDITAR:Exemplo primário alterado de Zork Dungeon para o shell padrão do sistema operacional.

Tenho um aplicativo de console em execução em uma máquina moderna. Eu também tenho um Apple //e com uma placa Super Serial, que permite que ele funcione como um terminal burro por meio de uma conexão serial COM (detalhes são inúteis além disso). Posso conectar esses dois dispositivos perfeitamente usando uma porta serial USB.

Quando a máquina moderna inicializa o Linux, definindo as configurações COM e concedendo-me direitos ao grupo ao qual o arquivo do dispositivo pertence, posso executar

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

e faça uma sessão bash no Apple - a máquina Linux atua como servidor e executa o programa, mas a entrada e a saída vão para o Apple, que é um cliente simples. Isso também funciona com programas mais dedicados, como dungeon(Zork).

Como faço a mesma coisa no Windows? Obviamente, não posso replicar exatamente a solução acima, pois o Windows só me permite ter uma COMporta aberta em um lugar por vez - executando o análogo do Windows do comando acima,

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

me dá um erro de acesso negado.

Posso enviar dados para a porta COM:

C:\> echo "Hello" >COM4

e leia a entrada bruta (incluindo caracteres de controle e escape!) da porta COM:

C:\> type <COM4

mas não posso fazer as duas coisas ao mesmo tempo, no mesmo processo ou em processos separados.

Tentei usar PuTTY e RealTerm, mas ambos só me permitem operar o Apple a partir da máquina Windows, o que prova que a conexão funciona, mas é exatamente na direção oposta do que desejo. Como hospedo um aplicativo de console do Windows para acesso a partir de um terminal conectado?

Responder1

Editar:"Respondido novamente" após esclarecimento da pergunta

De acordo comMicrosoft(Não consigo encontrar Using command redirection operatorsa seção para Windows mais recente que o XP):

Duplicando alças

O operador de redirecionamento & duplica a saída ou entrada de um identificador especificado para outro identificador especificado. Por exemplo, para enviar a saída dir para File.txt e enviar a saída de erro para File.txt, digite:

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

Ao duplicar um identificador, você duplica todas as características da ocorrência original do identificador. Por exemplo, se um identificador tiver acesso somente gravação, todas as duplicatas desse identificador terão acesso somente gravação. Você não pode duplicar um identificador com acesso somente leitura em um identificador com acesso somente gravação.

Então, uma boa notícia é:

  • Você pode mudar <COM4 >COM4 2>COM4para <COM4 >&1 2>&1.

A má notícia é:

  • Você está misturando requisitos de acesso de identificador somente leitura <COM4e somente gravação >&1 2>&1e está mudando Access Deniedpara The handle could not be duplicated during redirection of handle 1.

Se você mudar:

  • <COM4 >&1 2>&1to >COM4 2>&1 <&1(somente leitura e somente gravação ainda estão misturados) que funciona e fornece um STDOUTand utilizável STDERR, mas STDINainda parece * estar quebrado. (*)Já fiz alguns testes, mas parece que STDINnão funciona...

No entanto, posso ver uma solução alternativa para corrigi-lo:

  • Usarcom0comemulador de modem nuloe defina 3 pares de portas virtuais:
    • COM_O- COM_O4para STDOUT;
    • COM_E- COM_E4para STDERR;
    • COM_I- COM_I4para STDIN.
  • Faça um hub serial com hub4com.exe( com0comparte) de COM_O4, COM_E4e :COM_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
    • Lembre-se de configurar os parâmetros de transmissão adequados (de sua propriedade): --baud...
  • E <\\.\COM_I >\\.\COM_O 2>\\.\COM_Eforme a linha de comando.


Finalmente, para:

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

e:

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

você tem uma linha de comando do Windows COM4em 19200 8N1...

informação relacionada