
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 COM
porta 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 operators
a 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>COM4
para<COM4 >&1 2>&1
.
A má notícia é:
- Você está misturando requisitos de acesso de identificador somente leitura
<COM4
e somente gravação>&1 2>&1
e está mudandoAccess Denied
paraThe handle could not be duplicated during redirection of handle 1
.
Se você mudar:
<COM4 >&1 2>&1
to>COM4 2>&1 <&1
(somente leitura e somente gravação ainda estão misturados) que funciona e fornece umSTDOUT
and utilizávelSTDERR
, masSTDIN
ainda parece * estar quebrado. (*)Já fiz alguns testes, mas parece queSTDIN
não funciona...
No entanto, posso ver uma solução alternativa para corrigi-lo:
- Usar
com0com
emulador de modem nuloe defina 3 pares de portas virtuais:COM_O
-COM_O4
paraSTDOUT
;COM_E
-COM_E4
paraSTDERR
;COM_I
-COM_I4
paraSTDIN
.
Faça um hub serial com
hub4com.exe
(com0com
parte) deCOM_O4
,COM_E4
e :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
- Lembre-se de configurar os parâmetros de transmissão adequados (de sua propriedade):
--baud
...
E
<\\.\COM_I >\\.\COM_O 2>\\.\COM_E
forme 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 COM4
em 19200 8N1
...