¿Cómo sé si un puerto serie realmente está transmitiendo datos, sin abrir el dispositivo?

10

Tengo un clúster de alta disponibilidad (Heartbeat) conectado a través de una línea serie y dos NIC de Ethernet. Me gustaría configurar un script de monitoreo capaz de reconocer la línea serial desconectada (básicamente la misma pregunta fue respondida en SO , sin embargo, no estoy satisfecho con una respuesta tan general).

No puedo simplemente abrir el dispositivo en serie y leer los datos yo mismo, ya que Heartbeat abre la línea en serie.

Entonces comencé a buscar algunas pistas indirectas. La única diferencia que he encontrado hasta ahora está en el contenido de /proc/tty/driver/serial. Así es como se ve cuando 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

Y cuando se desconecta:

# 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

No tengo la confianza suficiente para decidir que las señales enumeradas al final de la línea tienen el mismo significado de cable conectado / desconectado ya que no he encontrado ninguna documentación sobre el contenido de / proc / tty / driver / serial. Solo puedo suponer que la presencia de la señal significa que la señal dada está en "en este momento" (¿o fue en el pasado reciente? O?). El COMO en Serie dice que las señales adicionales presentes cuando el cable está conectado (señal de control de flujo CTS, DSR "Estoy listo para comunicar", CD "Módem conectado a otro") están todas en la dirección de "entrada". Entonces tiene que haber alguien vivo en el otro extremo.

Suponiendo que el significado de las señales es como se describe en el COMO de serie, puedo basar mi decisión en la presencia de, por ejemplo, señal de CD. Sin embargo, no estoy realmente seguro.

Entonces la pregunta es: ¿mi método es "correcto" o tengo mejores opciones que desconozco?

EDITAR: Hice algunas observaciones adicionales y tuve una conversación con mi colega. Resulta que la presencia o ausencia de señales al final de la línea es un indicador bastante bueno de la actividad del puerto serie, en ambos extremos. Sin embargo, no es un indicador de la presencia física de un cable. Siempre que había un programa que escribía en el puerto serie, las señales salientes estaban presentes (RTS | DTR). Cuando el otro lado estaba escribiendo, las señales entrantes estaban presentes (CTS | DSR | CD). Cuando ninguno de los lados se comunica, no hay señales en absoluto (eso no significa necesariamente que no haya cable presente). No olvide que las señales exactas dependen del cableado del cable (tengo "módem nulo con apretón de manos parcial").

Peter Kovac
fuente
Suena como un comienzo razonable y uno fácilmente probado. También puede echar un vistazo a '/ sys / devices / platform / serial8250 / tty / ttyS0 /', o algo similar en su sistema.
rickhg12hs

Respuestas:

5

RS232 no tiene ningún indicador de "presencia de cable" de ningún tipo. Solo está recibiendo señales de transmisión o metadatos (control), o no, eso es todo lo que sabe. Si recibe una señal entrante (CTS | DSR | CD), sabe que el cable está conectado. Si no recibe ninguna señal entrante, el estado del cable es indeterminado y no hay forma de determinar si está enchufado sin soluciones de hardware adicionales, o si realiza algún tipo de intercambio con el dispositivo remoto.

El enfoque habitual es realizar algún tipo de transmisión "mantener vivo" (incluso solo metadatos, por ejemplo, configurar DTR momentáneamente y esperar CTS), pero si la disciplina del protocolo utilizado por el software en los dos extremos del cable prohíbe dicho intercambio inactivo, usted ' Estás prácticamente atascado con el uso de un soldador para continuar.

Lo que podría intentar es algún tipo de "demonio" adicional que establezca una tubería, reenvíe datos entre su software y el dispositivo físico (en ambos extremos), encapsúlelo y realice "verificaciones de conexión" si la tubería está inactiva.

Permítanme agregar una solución bastante común: si su dispositivo de punto final no usa control de hardware, puede acortar el DTR con CTS dentro del enchufe en el lado del host y usar 'control de hardware' en el lado del host. La generación de DTR impulsa automáticamente CTS, lo que permite la transmisión, si el cable está presente, por lo que la transmisión no se ve afectada. Mientras tanto, con el cable ausente, el sistema reaccionará a la falta de CTS de una manera apropiada para este evento, por ejemplo, generando un tiempo de espera o suspendiendo la transmisión hasta que el cable esté enchufado.

SF.
fuente
Lo del "demonio" es una idea inteligente. Sin embargo, no voy a implementarlo ya que me temo que se convertirá en una fuente de errores de estabilidad. Seguiré leyendo las señales de / proc y solo indicando la presencia o ausencia de singles entrantes / salientes. Eso es suficiente para mi.
Peter Kovac
Es como el gato de Schrodinger. en.wikipedia.org/wiki/Schr%C3%B6dinger%27s_cat
Ufoguy
0

Hay un indicador de presencia que le indica que tiene un dispositivo conectado al otro extremo, pero es opcional, la transmisión funciona con o sin la señal de presencia.

Resistente
fuente