Como fazer o controle de fluxo de hardware DTR / DSR no Linux (programação de 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á um caminho 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 comunicação confiável de 8 bits.

nlucas
fonte
Votou para excluir minha resposta para aumentar as chances de obter melhores respostas. Isso realmente parece ser um problema interessante que outras pessoas também enfrentaram. Curiosamente, havia pelo menos 3 patches de kernel (2001, 2008 e 2010) para resolver esse problema, mas nenhum deles parece ser implementado nos kernels de distribuição atuais. Parece que a única solução (se não for usar a opção de cabo personalizado) seria corrigir o kernel sozinho. Se for para terminais POS onde você tem controle sobre todos os softwares de instalação, um BSD UNIX também pode valer uma tentativa.
ktf
Este comentário realmente me ajudou. Descobri que o Red Hat Enterprise Linux 5.3 incluía um patch para corrigir esse problema [1] em um kernel 2.6.18. Como o RHEL é praticamente um tipo de padrão da indústria, acredito que é bastante seguro usar o patch [2]. [1] rhn.redhat.com/errata/RHSA-2009-0225.html [2] bugzilla.redhat.com/show_bug.cgi?id=445211
nlucas

Respostas:

3

Respondendo a minha própria pergunta, graças a uma sugestão de @ktf, descobri que pelo menos desde 2.6.28 [1] há IOCTLs (TCGETX, TCSETX, TCSETXF & 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 anexado um exemplo de como usá-lo.

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

ATUALIZAR

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

[1] http://lxr.free-electrons.com/ident?v=2.6.28;i=TCGETX
[2] https://lkml.org/lkml/2008/10/13/120
[3] https://bugzilla.redhat.com/show_bug.cgi?id=445211
[4] https://bugzilla.redhat.com/attachment.cgi?id=315300&action=diff

nlucas
fonte