2009-06-29 115 views

回答

14

與USB不同,串行端口沒有任何內置方式來檢測鏈路狀態的物理變化。可以使用某些引腳(即DTR,DSR,有時DCD)完成「設備就緒/未準備好」信號的有限形式,但這看起來不像您正在尋找的內容(它不是內置的到RS232 - 設備必須支持它,你主要用它來與調制解調器通信。)

因此,簡而言之:不,在一般情況下。如果你知道/可以編程你想要與之通信的設備,並且你知道它將保持一定的高度(例如),那麼你可以輪詢它,尋找那條線路進入高位。但是如果你插入一個沒有編程的設備來做一些可預測的事情,那麼真的沒有辦法告訴。 (某些設備可能默認DSR爲高電平,但絕對不能確定。)

0

可以檢測可獲取的串行端口,則可以嘗試裏面與他們comunicate一個try ... catch塊。

這是端口檢測在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

我認爲,這種形式的.Connect()的循環綁定到端口的每個連接是笨重的,尤其是如果我想驅動SerialPortDisconnected事件一個很好的事件。 – maxfridbe 2009-06-29 19:30:48

+0

`string [] sPorts = SerialPort.GetPortNames();`不起作用,因爲當端口連接成ex:`COM1`而不是被拔出時`GetPortNames`仍然報告'COM1`存在......我剛測試過它。 – MrHIDEn 2015-01-21 09:44:54

1

我還沒有嘗試過,但看SerialPort.PinChanged事件和DsrChanged一個例子。

每當有任何正常的設備插入串口並打開,那麼我希望端口的DSR引腳被聲明;相反,如果該設備被拔掉,或者它被關閉,那麼我預計DSR引腳狀態會改變/下降。


的各引腳的通常含義是:

  • DSR:設備已插入且接通
  • CTS:設備已準備好接收數據(這可以是向下即使當設備被插入,例如當設備具有有限的板載緩衝器並且使用該引腳來流控制來自PC的數據傳輸時)
  • DCD:設備(調制解調器)已經通過電話線建立到另一個調制解調器的連接(所以你發送的任何東西都被視爲要傳輸的數據遠程調制解調器)

其中,回答你的OP的是DSR。

+1

如果您的設備正在使用硬件握手,則爲true。許多設備不。事實上一些串口甚至沒有連接這些引腳。 – 2009-06-29 19:33:23

0

這取決於您使用什麼類型的設備連接什麼樣的電纜。

最好的辦法是嘗試處理PinChanged事件處理程序。

某些設備在連接和打開時會引發DSR,而其他設備則會使用這些設備進行握手。

2

大多數串行設備對查詢都有某種類型的ack響應。只需發送一個簡單的查詢並等待響應。如果你沒有得到它,設備不在那裏或至少沒有響應。

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