Як дізнатися, чи послідовний порт насправді передає дані, не відкриваючи пристрій?


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. Однак я не дуже впевнений.

Тож питання: чи мій метод "правильний", чи є кращі варіанти, про які я не знаю?

EDIT: Я зробив кілька додаткових спостережень і поспілкувався з колегою. Виявляється, наявність або відсутність сигналів в кінці рядка є досить хорошим показником активності послідовного порту на обох кінцях. Однак це не показник фізичної наявності кабелю. Щоразу, коли була програма запису на послідовний порт, були вихідні сигнали (RTS | DTR). Коли інша сторона записувала вхідні сигнали, були присутніми (CTS | DSR | CD). Якщо жодна із сторін не зв’язується, сигналів взагалі немає (це не обов'язково означає, що кабелю немає). Не забувайте, що точні сигнали залежать від проводки кабелю (у мене "нульовий модем з частковим рукостисканням").


Звучить як розумний старт і один легко перевірений. Ви також можете переглянути "/ sys / devices / platform / serial8250 / tty / ttyS0 /", або щось подібне у вашій системі.
rickhg12hs

Відповіді:


5

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

Звичайний підхід полягає у виконанні певних передач "збереження життя" (навіть лише метаданих - наприклад, миттєво встановлений DTR та очікування CTS), але якщо дисципліна протоколу, що використовується програмним забезпеченням на двох кінцях кабелю, забороняє такий обмін непрацюючими, ви ' Re досить сильно застряг з використанням паяльника для продовження.

Що ви можете спробувати, це якийсь додатковий "демон", який встановлює трубу, пересилаючи дані між вашим програмним забезпеченням і фізичним пристроєм (з обох кінців), інкапсулюючи їх - і виконуючи "перевірку з'єднання", якщо труба не працює.

Дозвольте додати одне досить поширене рішення: якщо ваш пристрій кінцевої точки не використовує апаратне керування, ви можете коротко встановити DTR із CTS всередині штекера на стороні хоста та використовувати "апаратне керування" на стороні хоста. Генерування DTR автоматично запускає CTS, що забезпечує передачу, якщо кабель присутній, тому передача не впливає. Тим часом, якщо кабель відсутній, система реагуватиме на відсутність CTS способом, відповідним даній події, наприклад, генеруючи тайм-аут або зупиняючи передачу, поки кабель не підключений.


Річ "демон" - це розумна ідея. Однак я не збираюсь його реалізовувати, оскільки боюся, що він стане джерелом помилок у стабільності. Я буду дотримуватися читання сигналів від / proc і просто вказувати на наявність або відсутність вхідних / вихідних синглів. Цього мені достатньо.
Пітер Ковач

Це як кішка Шродінгера. en.wikipedia.org/wiki/Schr%C3%B6dinger%27s_cat
Ufoguy

0

Існує індикатор присутності, який повідомляє про те, що у вас підключений пристрій до іншого кінця, але це необов'язково, передача працює з сигналом присутності або без нього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.