Skąd mam wiedzieć, czy port szeregowy faktycznie przesyła dane bez otwierania urządzenia?


10

Mam klaster o wysokiej dostępności (Heartbeat) podłączony przez linię szeregową i dwie karty sieciowe Ethernet. Chciałbym skonfigurować skrypt monitorujący rozpoznający odłączoną linię szeregową (w zasadzie na SO udzielono odpowiedzi na to samo pytanie , jednak nie jestem zadowolony z tak ogólnej odpowiedzi).

Nie mogę po prostu otworzyć urządzenia szeregowego i sam odczytać danych, ponieważ linia szeregowa jest otwierana przez Heartbeat.

Zacząłem więc szukać pośrednich wskazówek. Jedyną różnicą, jaką do tej pory znalazłem, jest zawartość /proc/tty/driver/serial. Tak to wygląda, gdy jest połączone:

# 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

A po odłączeniu:

# 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

Nie jestem wystarczająco pewny, aby zdecydować, że sygnały wymienione na końcu linii mają takie samo znaczenie jak podłączony / odłączony kabel, ponieważ nie znalazłem żadnej dokumentacji dotyczącej zawartości / proc / tty / driver / serial. Mogę tylko założyć, że obecność sygnału oznacza, że ​​dany sygnał jest „teraz” (lub był w przeszłości? Lub?). Porty szeregowe mówi, że dodatkowe sygnały przedstawić, gdy kabel jest podłączony (CTS sygnał sterowania przepływem, DSR „Jestem gotowy do komunikowania się” CD „Modem podłączony do innego”) są w kierunku „Input”. Więc na drugim końcu musi być ktoś żywy.

Zakładając, że znaczenie sygnałów jest takie, jak opisano w Serial HOWTO, mogę oprzeć swoją decyzję na obecności, powiedzmy, sygnału CD. Jednak nie jestem do końca pewien.

Pytanie brzmi zatem: czy moja metoda jest „odpowiednia”, czy też mam lepsze opcje, których nie jestem świadomy?

EDYCJA: Zrobiłem kilka dodatkowych obserwacji i rozmawiałem z moim kolegą. Okazuje się, że obecność lub brak sygnałów na końcu linii jest dość dobrym wskaźnikiem aktywności portu szeregowego na obu końcach. Nie jest to jednak wskaźnik fizycznej obecności kabla. Ilekroć istniał program zapisujący do portu szeregowego, były obecne sygnały wychodzące (RTS | DTR). Gdy druga strona pisała, obecne były przychodzące sygnały (CTS | DSR | CD). Kiedy żadna ze stron się nie komunikuje, nie ma żadnych sygnałów (co niekoniecznie oznacza, że ​​nie ma kabla). Nie zapominaj, że dokładne sygnały zależą od okablowania kabla (mam „modem zerowy z częściowym uzgadnianiem”).


Brzmi jak uzasadniony początek i taki, który łatwo przetestować. Możesz także zajrzeć do „/ sys / devices / platform / serial8250 / tty / ttyS0 /” lub czegoś podobnego w swoim systemie.
rickhg12hs

Odpowiedzi:


5

RS232 nie ma żadnego wskaźnika „obecności kabla”. Po prostu dostajesz sygnały transmisyjne lub metadane (kontrolne), albo nie - to wszystko, co wiesz. Jeśli otrzymasz sygnał przychodzący (CTS | DSR | CD), wiesz, że kabel jest podłączony. Jeśli nie otrzymujesz żadnego przychodzącego sygnału, stan kabla jest nieokreślony i nie ma sposobu, aby ustalić, czy jest on podłączony bez dodatkowych rozwiązań sprzętowych - czy wykonując jakąś wymianę z urządzeniem zdalnym.

Zwykłym podejściem jest przeprowadzanie pewnego rodzaju transmisji „utrzymujących przy życiu” (nawet tylko metadanych - np. Chwilowo ustaw DTR i oczekuj CTS), ale jeśli dyscyplina protokołu wykorzystywanego przez oprogramowanie na dwóch końcach kabla zabrania takiej bezczynności wymiany, w dalszym ciągu bardzo utknąłem przy użyciu lutownicy.

To, co możesz spróbować, to jakiś dodatkowy „demon”, który tworzy potok, przekazuje dane między twoim oprogramowaniem a urządzeniem fizycznym (na obu końcach), hermetyzuje je i wykonuje „kontrole połączenia”, jeśli potok jest bezczynny.

Pozwól mi dodać jedno dość powszechne rozwiązanie: jeśli twoje urządzenie końcowe nie używa kontroli sprzętowej, możesz skrócić DTR z CTS wewnątrz wtyczki po stronie hosta i użyć „kontroli sprzętu” po stronie hosta. Generowanie DTR automatycznie steruje CTS, umożliwiając transmisję, jeśli kabel jest obecny, więc transmisja nie ulega zmianie. Tymczasem przy braku kabla system zareaguje na brak CTS w sposób odpowiedni dla tego zdarzenia, np. Wygeneruje limit czasu lub zawiesi transmisję, dopóki kabel nie zostanie podłączony.


„Demon” to sprytny pomysł. Jednak nie zamierzam go wdrożyć, ponieważ obawiam się, że stanie się źródłem błędów stabilności. Pozostanę przy czytaniu sygnałów z / proc i po prostu wskazując obecność lub brak przychodzących / wychodzących singli. To mi wystarczy.
Peter Kovac


0

Wskaźnik obecności informuje, że masz urządzenie podłączone do drugiego końca, ale jest to opcjonalne, transmisja działa z sygnałem obecności lub bez niego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.