1

如何使用 C# 的SerialPort类发现设备是否连接到特定的串行 (COM) 端口?

Open注意:即使没有设备连接到端口,该类的方法也会打开端口。

4

4 回答 4

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();
    }
}
于 2012-10-10T06:31:25.540 回答
2

答案取决于设备和电缆。

在某些情况下,连接设备时会引发DSR ( SerialPort.DsrHolding) 甚至 CTS ( )。SerialPort.CtsHolding

但在某些情况下,您可能只连接了 Tx / Rx,唯一的判断方法是尝试与设备通信。

您需要查看设备及其电缆的文档。

没有适用于任何设备的通用解决方案。

于 2012-10-10T07:47:26.833 回答
0

您可以通过打开串行端口并发送您的设备支持的最基本命令并检查响应来做到这一点。例如,对于 GSM 调制解调器,您打开端口并按命令发送并接收 ok 作为响应。

于 2012-10-10T06:23:50.820 回答
0

您可以尝试几件事

  1. 创建串行端口对象并打开一个端口,现在当设备连接时,操作系统应该发送 CDChanged 事件。
  2. 您 ping 串行端口,如果收到回复,则假设它已连接。
于 2012-10-10T06:29:51.843 回答