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. Eu gostaria de configurar um script de monitoramento capaz de reconhecer a linha serial desconectada (basicamente a mesma pergunta era respondida na SO , no entanto, não estou satisfeito com uma resposta tão geral).

Eu não posso simplesmente abrir o dispositivo serial e ler os dados eu mesmo, já que a linha serial é aberta pelo Heartbeat.

Então eu comecei a procurar por algumas pistas indiretas. A única diferença que encontrei até agora é no conteúdo de /proc/tty/driver/serial . É assim que parece 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 significado de cabo conectado / desconectado, pois não encontrei nenhuma documentação sobre o conteúdo do / proc / tty / driver / serial . Eu só posso supor que a presença do sinal significa que o sinal dado está em "agora" (ou foi no passado recente? Ou?). O Seriais HOWTO 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 de "entrada". Então tem que haver alguém vivo do outro lado.

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

Então a pergunta é: é o meu método "certo", ou eu tenho alguma opção melhor que eu não conheça?

EDITAR: 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, em ambas as extremidades. No entanto, não é um indicador da presença física de um cabo. Sempre que havia um programa escrevendo para a porta serial, sinais de saída estavam presentes (RTS | DTR). Quando o outro lado estava escrevendo sinais de entrada estavam presentes (CTS | DSR | CD). Quando nenhum dos lados se comunica, não há sinais (isso não significa necessariamente que não exista nenhum cabo presente). Não esqueça que os sinais exatos dependem da fiação do cabo (eu tenho "null" modem com handshaking parcial ").

    
por Peter Kovac 26.11.2013 / 17:39

2 respostas

5

O RS232 não possui nenhum indicador de "presença por 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), você 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 adicionais de hardware - ou se está 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, definir momentaneamente DTR e esperar CTS), mas se a disciplina de protocolo usada pelo software nas duas extremidades do cabo proíbe essa troca ociosa , você está praticamente preso a usar um ferro de solda para prosseguir.

O que você pode tentar, é algum tipo de "demon" adicional que configura um pipe, encaminhando dados entre seu software e o dispositivo físico (em ambas as extremidades), encapsulando-o - e executando "verificações de conexão" se o pipe estiver ocioso.

Deixe-me adicionar uma solução bastante comum: se o seu dispositivo endpoint não usa controle de hardware, você pode reduzir o DTR com CTS dentro do plug no host e usar 'hardware control' no host. A geração de DTR aciona automaticamente o CTS, possibilitando a transmissão, se o cabo estiver presente, para que a transmissão não seja afetada. Entretanto, com o cabo ausente, o sistema reagirá à falta de CTS de uma maneira apropriada para este evento, e. gerando um tempo limite ou suspendendo a transmissão até que o cabo seja conectado.

    
por 27.11.2013 / 10:54
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.

    
por 17.04.2015 / 14:07