2012-10-10 216 views
1

如何使用C#的SerialPort類發現設備是否連接到特定的串行(COM)端口?如何發現設備是否連接到特定的串行(COM)端口?

注意:即使沒有設備連接到端口,該類的Open方法也會打開端口。

+0

當設備連接到端口並啓動時,DsrHolding屬性爲true。當然你不知道*什麼*特定的設備,直到你開始談論它。 –

+0

「設備連接時DsrHolding屬性將爲true」 - 可能會也可能不會,具體取決於設備和電纜。 – Joe

回答

1

答案取決於在設備和電纜上。

在某些情況下,連接設備時會引發DSR(SerialPort.DsrHolding)甚至CTS(SerialPort.CtsHolding)。

但是在某些情況下,您可能只連接了Tx/Rx,唯一需要說明的是嘗試與設備進行通信。

您需要查看設備及其電纜的文檔。

沒有適用於任何設備的通用解決方案。

0

您可以通過打開串口併發送設備支持的最基本命令並檢查響應來完成。例如,對於GSM調制解調器,您可以打開端口並按命令發送,並可以收到響應。

0

夫婦的事情,你可以嘗試

  1. 創建串口對象,然後打開一個端口,現在當設備連接 ,OS應該發送CDChanged事件。
  2. 您可以ping通串口,並且如果您收到迴應,請假定它已連接。
+0

你確定任何設備必須返回一些響應嗎?讓我檢查一下。 – Saran

+0

@Saran:不是所有設備都不強制返回消息。 –

3

1.WMI:SELECT * FROM Win32_SerialPort

ManagementObjectSearcher manObjSearch = new ManagementObjectSearcher("Select * from Win32_SerialPort"); 
ManagementObjectCollection manObjReturn = manObjSearch.Get(); 

foreach (ManagementObject manObj in manObjReturn) 
{ 
    //int s = manObj.Properties.Count; 
    //foreach (PropertyData d in manObj.Properties) 
    //{ 
    // Console.WriteLine(d.Name); 
    //} 
    Console.WriteLine(manObj["DeviceID"].ToString()); 
    Console.WriteLine(manObj["Name"].ToString()); 
    Console.WriteLine(manObj["Caption"].ToString()); 
} 

2.如果設備發送迴響應:System.IO.Ports.SerialPort.GetPortNames() 和發送基本命令:

foreach (string portname in SerialPort.GetPortNames()) 
{ 
    var sp = new SerialPort(portname, 4800, Parity.Odd, 8, StopBits.One); 
    try 
    { 
     sp.Open(); 
     sp.Write("Your known command to device"); 
     Thread.Sleep(500); 
     string received = sp.ReadLine(); 

     if (received == "expected response") 
     { 
      Console.WriteLine("device connected to: " + portname); 
      break; 
     } 
    } 
    catch (Exception) 
    { 
     Console.WriteLine("device NOT connected to: " + portname); 
    } 
    finally 
    { 
     sp.Close(); 
    } 
} 
+0

如果設備已連接並且不會發回任何響應,該怎麼辦?例如連接到COM端口的極點顯示器可能不會發回任何數據。 – Saran

+0

我更新了我的答案。 – Ria

相關問題