Como fazer o SOCAT enviar cada caractere do STDIO?

1

Eu tenho o seguinte cenário:

Eu tenho um Windows em uma VM, que tem uma porta serial exposta a um canal host (named-pipe / fifo).

O canal do host está em /tmp/win-serial-com3 .

No sistema operacional do meu host, estou usando socat da seguinte forma:

socat - /tmp/win-serial-com3,cr

No convidado, estou abrindo PuTTY e definindo "implícito LF em cada CR "e o eco local está ativado. O PuTTY abre a COM3 no Windows convidado.

Com ambos funcionando, teclas de retorno funcionam bem, não há duplicação, etc. Eu posso digitar no PuTTY e posso ver cada caractere aparecer um após o outro no terminal no meu sistema operacional host, onde socat está em execução.

No entanto, quando eu digito algo no sistema operacional host, posso ver o eco local (como não está desativado com a opção echo=0 ), mas o caractere aparecerá no PuTTY no meu guest guest, somente depois de retornar .

O que eu gostaria de acontecer, é que cada vez que eu pressiono uma tecla, essa chave é enviada para o pipe nomeado, essencialmente tendo o mesmo comportamento que o PuTTY no sistema operacional convidado.

Suponho que isso tenha algo a ver com o armazenamento em buffer de STDIO ( - ), mas não tenho certeza.

    
por polemon 21.03.2018 / 03:20

1 resposta

0

OK, encontrei a solução e levei um pouco de tentativa e erro:

No lado do host (Linux), é assim que socat precisa ser chamado:

stty -icanon && socat - /tmp/win-serial-com3,cr

No lado do Convidado, o PuTTY deve ser invocado com "LF Implicit em cada CR", e desabilitado "CR de Implicidade em cada LF", nas configurações de "Terminal".

Ainda não é o ideal.

Quando pressiono backspace no lado do host, ele imprime um ^? , em vez de apagar o caractere anterior. No lado do convidado, isso funciona bem. Ao pressionar backspace no lado do convidado, apaga os caracteres do lado do convidado, mas não do lado do host. Eu ainda tenho que encontrar uma maneira de trabalhar com o backspace .

    
por 23.03.2018 / 19:31