Como fazer o controle de fluxo de hardware DTR / DSR no Linux (programação da porta serial)?

4

É possível configurar uma comunicação de porta serial usando o controle de fluxo de hardware com os pinos RTS / CTS (sinalizador CRTSCTS para tcsetattr), mas não é possível usar os pinos DTR / DSR para controle de fluxo de maneira confiável e eficiente.

Pode-se usar o TIOCMGET ioctl () para verificar o estado do pino, mas então precisamos enviar um byte de cada vez, o que o torna MUITO LENTO!

Não há uma maneira melhor? Fazer nossos próprios cabos não é dimensionável e existem muitas impressoras seriais no mercado que só usam controle de fluxo DTR / DSR.

P.S.- Esqueça o XON / XOFF, eu preciso de uma comunicação confiável de 8 bits.

    
por nlucas 10.10.2011 / 17:40

1 resposta

3

Respondendo a minha própria pergunta, graças a uma sugestão do @ktf, descobri que pelo menos desde 2.6.28 [1] há IOCTLs (TCGETX, TCSETX, TCSETXF e TCSETXW) para configurar atributos estendidos.

Eles parecem ter sido adicionados ao kernel upstream em 13 de outubro de 2008 [2].

Esses IOCTLs extras (compatíveis com o SYS5) permitem configurar cada um dos pinos extras que são manipulados individualmente.

Veja o link para o patch RHEL original [3] e procure no exemplo de teste anexo um exemplo de como usá-lo.

As definições IOCTL estão no arquivo "asm-generic / ioctls.h" e as constantes de estrutura e bandeira são definidas em "linux / termios.h" (em "/ usr / include", fora do curso).

UPDATE

Outras pesquisas mostram que o suporte serial genérico para este IOCTL não foi mesclado na origem do kernel upstream. RHEL 5.3 tem isso, mas não o kernel 3.0.6 do upstream.
Isso significa que a chamada ioctl () falhará em qualquer outro kernel que não tenha portado o patch do RHEL [4].

[1] link
[2] link
[3] link
[4] link

    
por 12.10.2011 / 15:13