Как узнать, действительно ли последовательный порт передает данные, не открывая устройство?

10

У меня есть кластер высокой доступности (Heartbeat), подключенный через последовательную линию и две сетевые карты. Я хотел бы установить скрипт мониторинга, способный распознавать отключенную последовательную линию (в основном на тот же вопрос был дан ответ в SO , однако я не удовлетворен таким общим ответом).

Я не могу просто открыть последовательное устройство и прочитать данные самостоятельно, поскольку последовательная линия открывается Heartbeat.

Поэтому я начал искать некоторые косвенные подсказки. Единственное отличие, которое я обнаружил, заключается в содержании /proc/tty/driver/serial. Вот как это выглядит, когда он подключен:

# 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

И когда отключено:

# 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

Я не достаточно уверен, чтобы решить, что сигналы, перечисленные в конце строки, имеют значение подключенного / отключенного кабеля, так как я не нашел никакой документации по содержанию / proc / tty / driver / serial. Я могу только предположить, что наличие сигнала означает, что данный сигнал включен «прямо сейчас» (или был в недавнем прошлом? Или?). В Serial HOWTO говорится, что дополнительные сигналы, присутствующие при подключении кабеля (сигнал управления потоком CTS, DSR «Я готов к общению», CD «Модем подключен к другому»), все в направлении «ввода». Так что на другом конце должен быть кто-то живой.

Предполагая, что значение сигналов соответствует описанию в Serial HOWTO, я могу основывать свое решение на наличии, скажем, сигнала CD. Однако я не совсем уверен.

Итак, вопрос в следующем: мой метод «правильный», или у меня есть какие-то лучшие варианты, о которых я не знаю?

РЕДАКТИРОВАТЬ: Я сделал некоторые дополнительные замечания и поговорил с моим коллегой. Оказывается, наличие или отсутствие сигналов в конце линии является неплохим индикатором активности последовательного порта на обоих концах. Однако это не показатель физического присутствия кабеля. Всякий раз, когда происходила запись программы в последовательный порт, присутствовали исходящие сигналы (RTS | DTR). Когда другая сторона писала входящие сигналы присутствовали (CTS | DSR | CD). Когда ни одна из сторон не связывается, сигналов вообще нет (это не обязательно означает, что кабеля нет). Не забывайте, что точные сигналы зависят от проводки кабеля (у меня «нуль-модем с частичным подтверждением связи»).

Петр Ковач
источник
Звучит как разумное начало и легко проверяется. Вы также можете посмотреть в '/ sys / devices / platform / serial8250 / tty / ttyS0 /' или что-то похожее в вашей системе.
rickhg12hs

Ответы:

5

RS232 не имеет никакого индикатора присутствия кабеля. Вы просто получаете сигналы передачи или метаданных (контроля) или нет - это все, что вы знаете. Если вы получаете входящий сигнал (CTS | DSR | CD), вы знаете, что кабель подключен. Если вы не получаете никакого входящего сигнала, состояние кабеля является неопределенным, и нет никакого способа определить, подключен ли он без дополнительных аппаратных решений или выполнения какого-либо обмена с удаленным устройством.

Обычный подход заключается в выполнении какой-то передачи «поддержания активности» (даже просто метаданных - например, мгновенно установить DTR и ожидать CTS), но если дисциплина протокола, используемая программным обеспечением на двух концах кабеля, запрещает такой обмен в режиме ожидания, вы ' Вы продолжаете использовать паяльник.

Что вы можете попробовать, это какой-то дополнительный «демон», который устанавливает канал, пересылает данные между вашим программным обеспечением и физическим устройством (на обоих концах), инкапсулирует его - и выполняет «проверки соединения», если канал свободен.

Позвольте мне добавить одно довольно распространенное решение: если ваше оконечное устройство не использует аппаратное управление, вы можете закорочить DTR с CTS внутри разъема на стороне хоста и использовать «аппаратный контроль» на стороне хоста. Генерация DTR автоматически приводит в действие CTS, позволяя передачу, если кабель присутствует, поэтому передача не затрагивается. Между тем, при отсутствии кабеля система будет реагировать на отсутствие CTS способом, соответствующим этому событию, например, генерируя тайм-аут или приостанавливая передачу, пока кабель не будет подключен.

Научная фантастика
источник
«Демон» - умная идея. Однако я не собираюсь это реализовывать, так как боюсь, что это станет источником ошибок стабильности. Я придерживаюсь чтения сигналов из / proc и просто указываю на наличие или отсутствие входящих / исходящих синглов. Этого достаточно для меня.
Петр Ковач
Это как кот Шредингера. en.wikipedia.org/wiki/Schr%C3%B6dinger%27s_cat
Ufoguy
0

Есть индикатор присутствия, который сообщает вам, что у вас есть устройство, подключенное к другому концу, но это не обязательно, передача работает с сигналом присутствия или без него.

хулиган
источник