Como sei se uma porta serial está realmente transmitindo dados, sem abrir o dispositivo?


10

Eu tenho um cluster de alta disponibilidade (Heartbeat) conectado via linha serial e duas NICs Ethernet. Gostaria de configurar um script de monitoramento capaz de reconhecer a linha serial desconectada (basicamente a mesma pergunta foi respondida no SO , no entanto, não estou satisfeito com uma resposta tão geral).

Não consigo simplesmente abrir o dispositivo serial e ler os dados, pois a linha serial é aberta pelo Heartbeat.

Então comecei a procurar pistas indiretas. A única diferença que encontrei até agora está no conteúdo de /proc/tty/driver/serial. É assim que fica quando está conectado:

# cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:2722759 rx:2718165 brk:1 RTS|CTS|DTR|DSR|CD

E quando desconectado:

# cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:2725233 rx:2720703 brk:1 RTS|DTR

Não tenho confiança suficiente para decidir que os sinais listados no final da linha têm o mesmo significado de cabo conectado / desconectado, pois não encontrei nenhuma documentação sobre o conteúdo do / proc / tty / driver / serial. Só posso supor que a presença do sinal significa que o sinal fornecido está "no momento" (ou estava no passado recente? Ou?). O HOWTO Serial diz que os sinais adicionais presentes quando o cabo está conectado (sinal de controle de fluxo CTS, DSR "Estou pronto para me comunicar", CD "Modem conectado a outro") estão todos na direção "entrada". Então tem que haver alguém vivo do outro lado.

Supondo que o significado dos sinais seja como descrito no Serial HOWTO, posso basear minha decisão na presença de, digamos, sinal de CD. No entanto, não tenho muita certeza.

Portanto, a pergunta é: meu método está "correto" ou tenho melhores opções que não conheço?

EDIT: Fiz algumas observações adicionais e conversei com meu colega. Acontece que a presença ou ausência de sinais no final da linha é um bom indicador da atividade da porta serial, nos dois extremos. No entanto, não é um indicador da presença física de um cabo. Sempre que havia um programa gravando sinais de saída da porta serial, estavam presentes (RTS | DTR). Quando o outro lado estava gravando, havia sinais de entrada (CTS | DSR | CD). Quando nenhum dos lados se comunica, não há sinais (isso não significa necessariamente que não há cabo). Não esqueça que os sinais exatos dependem da fiação do cabo (eu tenho "modem nulo com handshake parcial").


Soa como um começo racional e fácil de testar. Você também pode procurar em '/ sys / devices / platform / serial8250 / tty / ttyS0 /' ou algo semelhante em seu sistema.
rickhg12hs

Respostas:


5

O RS232 não possui nenhum indicador de "presença de cabo". Você está apenas recebendo sinais de transmissão ou metadados (controle) ou não - isso é tudo que você sabe. Se você receber um sinal de entrada (CTS | DSR | CD), sabe que o cabo está conectado. Se você não receber nenhum sinal de entrada, o estado do cabo é indeterminado e não há como determinar se ele está conectado sem soluções de hardware adicionais - ou realizando algum tipo de troca com o dispositivo remoto.

A abordagem usual é realizar algum tipo de transmissão "keep-alive" (mesmo apenas metadados - por exemplo, defina momentaneamente o DTR e espere o CTS), mas se a disciplina do protocolo usado pelo software nas duas extremidades do cabo proíbe essa troca inativa, você ' você está praticamente preso ao usar um ferro de soldar para prosseguir.

O que você pode tentar é algum tipo de "demônio" adicional que configura um canal, encaminhando dados entre o software e o dispositivo físico (nas duas extremidades), encapsulando-o - e executando "verificações de conexão" se o canal estiver inativo.

Deixe-me adicionar uma solução bastante comum: se o seu dispositivo de ponto final não usa controle de hardware, você pode colocar um DTR curto com CTS dentro do plugue no lado do host e usar 'controle de hardware' no lado do host. A geração de DTR aciona automaticamente o CTS, permitindo a transmissão, se o cabo estiver presente, para que a transmissão não seja afetada. Enquanto isso, com o cabo ausente, o sistema reagirá à falta de CTS de maneira apropriada para esse evento, por exemplo, gerando um tempo limite ou suspendendo a transmissão até que o cabo seja conectado.


O "daemon" é uma ideia inteligente. No entanto, não vou implementá-lo, pois temo que se torne uma fonte de bugs de estabilidade. Eu continuarei lendo sinais de / proc e apenas indicando a presença ou ausência de singles de entrada / saída. Isso é o suficiente para mim.
precisa

É como o gato de Schrodinger. en.wikipedia.org/wiki/Schr%C3%B6dinger%27s_cat
Ufoguy

0

Existe um indicador de presença para informar que você tem um dispositivo conectado à outra extremidade, mas é opcional, a transmissão funciona com ou sem o sinal de presença.

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.