2009-06-29 9 views

Odpowiedz

14

W przeciwieństwie do USB, port szeregowy nie ma żadnego wbudowanego sposobu wykrywania fizycznej zmiany stanu łącza. Ograniczoną formę sygnalizacji "urządzenie gotowe/niegotowe" można wykonać za pomocą niektórych pinezek (mianowicie DTR, DSR, a czasem DCD), ale nie wydaje się to dokładnie to, czego szukasz (nie jest wbudowane na RS232 - urządzenie musi go obsługiwać, głównie używasz go do komunikowania się z modemami.)

Krótko mówiąc: nie, w ogólnym przypadku. Jeśli znasz/możesz zaprogramować urządzenie, z którym próbujesz się komunikować, i wiesz, że będzie ono utrzymywać określoną linię na wysokim poziomie (na przykład), możesz sondować, szukając linii, która będzie wysoka. Ale jeśli podłączysz urządzenie, które nie jest zaprogramowane na zrobienie czegoś tak przewidywalnego, to naprawdę nie da się tego powiedzieć. (Niektóre urządzenia mogą domyślnie trzymać DSR, ale w żaden sposób nie jest to pewny zakład.)

0

można wykryć dostepne porty seryjny, można spróbować porozumieć się z nimi w środku spróbuj ... catch catch.

To jest przykład wykrywania portów w C#

using System; 
using System.Collections.Generic; 
using System.IO.Ports; 

public class MyClass 
{ 
public static void Main() 
{ 
    string[] sPorts = SerialPort.GetPortNames(); 
    foreach(string port in sPorts) 
    WL(port); 
    RL(); 
} 

#region Helper methods 

private static void WL(object text, params object[] args) 
{ 
    Console.WriteLine(text.ToString(), args); 
} 

private static void RL() 
{ 
    Console.ReadLine(); 
} 

private static void Break() 
{ 
    System.Diagnostics.Debugger.Break(); 
} 

#endregion 
} 
+1

wierzę, że ta forma .Podłączyć() w pętli wiążącej do portu dla każdego połączenia jest niezgrabne, zwłaszcza jeśli chcę piękny zdarzeniami SerialPortDisconnected zdarzeń. – maxfridbe

+0

'string [] sPorts = SerialPort.GetPortNames();' nie działa, ponieważ gdy port jest podłączony ex: 'COM1', a następnie jest odłączony' GetPortNames' nadal zgłasza "COM1" istnieje ... Właśnie to przetestowałem. – MrHIDEn

1

nie próbowałem, ale spojrzeć na wydarzenia SerialPort.PinChanged i DsrChanged.

Ilekroć jakieś normalne urządzenie jest podłączone do portu szeregowego i włączone, wtedy oczekiwałbym, że pin DSR portu zostanie zapewniony; i odwrotnie, jeśli to urządzenie jest odłączone, lub gdy jest wyłączone, to oczekiwałbym, że stan pinowy DSR zmieni się/spadnie.


zwykłe znaczenie poszczególnych szpilek jest:

  • DSR: urządzenie jest podłączone do zasilania i włączony
  • CTS: urządzenie jest gotowe do odbioru danych (może to być spowodowane nawet po urządzenie jest podłączone, np. gdy urządzenie ma ograniczony wewnętrzny bufor i wykorzystuje ten pin do sterowania przepływem danych z komputera)
  • DCD: urządzenie (modem) nawiązało połączenie przez linię telefoniczną z innym modemem (więc wszystko, co wysyłasz, traktowane jest jako dane do przesłania o zdalny modem)

Spośród tych osób, który odpowiada za OP, jest DSR.

+1

Prawda, jeśli urządzenie używa uzgadniania sprzętowego. Wiele urządzeń tego nie robi. W rzeczywistości niektóre porty szeregowe nie mają nawet tych pinów połączonych. –

0

To będzie zależeć od rodzaju urządzenia, które łączysz z jakim rodzajem kabla.

Najlepiej jest spróbować obsługi obsługi zdarzeń PinChanged.

Niektóre urządzenia będą podnosić DSR po podłączeniu i włączeniu, inne CTS, inne będą używać ich do uzgadniania.

2

Większość urządzeń szeregowych ma pewien rodzaj potwierdzenia odpowiedzi na zapytanie. po prostu wyślij proste zapytanie i czekaj na odpowiedź. Jeśli go nie dostaniesz, urządzenie nie istnieje lub przynajmniej nie odpowiada.

1

Istnieje jest sposobem na wykrycie usunięcia/włożenia portu szeregowego.NET - zobacz moją odpowiedź na Detect serial port insertion/removal

+0

Plakat prawdopodobnie chciał wykryć, czy * urządzenie * jest podłączone do portu szeregowego, a nie, jeśli port szeregowy jest zainstalowany w systemie. – Zmaster

+0

@Zmaster - masz rację! Chyba nie myślałem w ten sposób. Usunąłem swój komentarz, ale zostawię odpowiedź tutaj, na wypadek, gdyby ktoś szukał sytuacji, której dotyczy moja odpowiedź. – Pat

1
Public Class SerialPort 
     Inherits IO.Ports.SerialPort 

     Event Disconnected() 

     Public Sub OpenWithDisconnectionevent() 
      Me.Open() 
      Dim t As New Threading.Thread(AddressOf ConnectivityChecker) 
      t.Start() 
     End Sub 


     Sub ConnectivityChecker() 
      Do 
       If Me.IsOpen = False Then 
        RaiseEvent Disconnected() 
        GoTo ThreadExit 
       End If 
      Loop 
ThreadExit: 
     End Sub 
    End Class