【问题标题】:Finding USB serial ports from a .NET application under Windows 7在 Windows 7 下从 .NET 应用程序中查找 USB 串行端口
【发布时间】:2010-02-17 09:55:47
【问题描述】:

我有一个应用程序可以查找具有自定义 USB 描述符的特定 FTDI 串行端口。我当前的代码使用the example from Code Project,它在root\WMI 下搜索MSSerial_PortName WMI 表,并从root\CIMV2\WIN32_PnPEntity 中提取额外的USB 信息。

这在 XP 下运行良好,但该应用程序还必须在 Windows 7 上的标准用户下运行。在这种环境中访问 root\WMI 会导致“访问被拒绝”ManagementException。

在以标准用户身份运行时,任何人都可以建议一种将串行端口的 DOS 设备名称与 USB 信息交叉引用的方法吗?到目前为止,我查看了root\CIMV2\WIN32_SerialPort* 表,但它们只包含主板端口。我也考虑过使用SetupAPI,但我还没有找到一个完整且有效的 PInvoke 模板。

【问题讨论】:

    标签: .net windows-7 wmi serial-port


    【解决方案1】:

    我发现了一个适合我们案例的答案,虽然不是一个通用的答案。我们的USB转换器都是FTDI,FTDI提供DLL that handles this。我使用 DLL 的代码如下:

    UInt32 count = 0;
    FTDI.FT_STATUS status = ftdi.GetNumberOfDevices(ref count);
    if (status != FTDI.FT_STATUS.FT_OK)
    {
        log.Warn("Unable to access FTDI");
        return ports;
    }
    FTDI.FT_DEVICE_INFO_NODE[] list = new FTDI.FT_DEVICE_INFO_NODE[count];
    status = ftdi.GetDeviceList(list);
    if (status != FTDI.FT_STATUS.FT_OK)
    {
        log.Warn("Unable to access FTDI");
        return ports;
    }
    foreach (FTDI.FT_DEVICE_INFO_NODE node in list)
    {
        if ((status = ftdi.OpenByLocation(node.LocId)) == FTDI.FT_STATUS.FT_OK)
        {
            try
            {
                string comport;
                ftdi.GetCOMPort(out comport);
                ports.Add(new Port(comport, node.Description, node.SerialNumber));
            }
            finally
            {
                ftdi.Close();
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      这看起来很有希望。

      从 FDTI 网站上可以下载应用程序“Reassign COMNo Utility”。此应用程序在所有 Windows 平台上显示可用的 FTDI 设备。检查哪些 FDTI 设备可用有很大帮助。

      当我尝试在我自己的应用程序中使用您的代码时,我发现我在启动它时遇到了一些问题。如果可能,请扩展您的代码,以便任何人都可以将其用作示例项目,而无需费力地首先编译它。

      但仍然是一个巨大的贡献。 谢谢。

      下面是对我有用的示例代码。

      using FTD2XX_NET;
      private List<FDTIPort> FindFdtiUsbDevices()
          {
          ///////////////////////
          // Requires 
          // FTD2XX_NET.dll
          ///////////////////////
      
          List<FDTIPort> ports = new List<FDTIPort>();
      
          FTDI _ftdi = new FTDI();
      
          UInt32 count = 0;
          FTDI.FT_STATUS status = _ftdi.GetNumberOfDevices(ref count);
          if (status != FTDI.FT_STATUS.FT_OK)
          {
              Console.WriteLine("log.Warn: Unable to access FTDI");
              return ports;
          }
      
          FTDI.FT_DEVICE_INFO_NODE[] list = new FTDI.FT_DEVICE_INFO_NODE[count];
          status = _ftdi.GetDeviceList(list);
          if (status != FTDI.FT_STATUS.FT_OK)
          {
              Console.WriteLine("log.Warn: Unable to access FTDI");
              return ports;
          }
      
      
          foreach (FTDI.FT_DEVICE_INFO_NODE node in list)
          {
              if ((status = _ftdi.OpenByLocation(node.LocId)) == FTDI.FT_STATUS.FT_OK)
              {
                  try
                  {
                      string comport;
                      _ftdi.GetCOMPort(out comport);
      
                      if (comport != null && comport.Length > 0)
                      {
                          ports.Add(new FDTIPort(comport, node.Description.ToString(), node.SerialNumber.ToString()));
                      }
                   }
                   finally
                   {
                       _ftdi.Close();
                   }
              }
          }
      
          _ftdi.Dispose();
          return ports;
      }
      
      public class FDTIPort
      {
           private string _nodeComportName = "";
           private string _nodeDescription = "";
           private string _nodeSerialNumber = "";
      
          // Constructor
          public FDTIPort()
          {
              _nodeComportName = "";
              _nodeDescription = "";
              _nodeSerialNumber = "";
          }
          // Constructor
      
          public FDTIPort ( string nodeComportName, string nodeDescription, string nodeSerialNumber )
          {
              _nodeComportName = nodeComportName;
              _nodeDescription = nodeDescription;
              _nodeSerialNumber = nodeSerialNumber;
          }
      
          public string nodeComportName {
              get { return this._nodeComportName; }
          }
      
          public string nodeDescription
          {
              get { return this._nodeDescription; }
          }
      
          public string nodeSerialNumber
          {
              get { return this._nodeSerialNumber; }
          }
      
      }
      

      【讨论】:

      • 如果有人有问题,那是因为它的 FTDI 不是 FDTI。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      相关资源
      最近更新 更多