【问题标题】:How can I discover if a device is connected to a specific serial (COM) port?如何发现设备是否连接到特定的串行 (COM) 端口?
【发布时间】:2012-10-10 06:21:39
【问题描述】:

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

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

【问题讨论】:

  • 当设备连接到端口并通电时,DsrHolding 属性将为真。当然,在您开始与之交谈之前,您不会知道 什么 特定设备。
  • “连接设备时,DsrHolding 属性将为真” - 可能是也可能不是,具体取决于设备和电缆。

标签: c# .net serial-port


【解决方案1】:

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();
    }
}

【讨论】:

  • 如果设备已连接并且不会发回任何响应怎么办。例如,连接到 COM 端口的 Pole display 可能不会发回任何数据。
【解决方案2】:

答案取决于设备和电缆。

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

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

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

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

【讨论】:

    【解决方案3】:

    你可以尝试几件事

    1. 创建串行端口对象并打开一个端口,现在当设备 已连接,操作系统应发送 CDChanged 事件。
    2. 您 ping 串行端口,如果收到回复,则假定它已连接。

    【讨论】:

    • 您确定任何设备都必须返回一些响应吗?让我检查一下。
    • @Saran:不,所有设备都必须返回消息。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-05
      • 2014-10-10
      • 1970-01-01
      • 2023-01-23
      • 2014-10-15
      • 2018-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多