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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.