2010-02-17 43 views
5

我有一個應用程序查找具有自定義USB描述符的特定FTDI串行端口。我目前的代碼使用the example from Code Project,它搜索root\WMI下的MSSerial_PortName WMI表,並從root\CIMV2\WIN32_PnPEntity中剔除額外的USB信息。在Windows 7下從.NET應用程序中查找USB串行端口

這在XP下運行良好,但該應用程序還必須在Windows 7上以標準用戶身份運行。在此環境中訪問root\WMI會導致「訪問被拒絕」ManagementException

任何人都可以建議一種方法來交叉引用串口的DOS設備名稱與USB信息,而作爲標準用戶運行?到目前爲止,我已經看過root\CIMV2\WIN32_SerialPort*表,但它們只包含主板端口。我也考慮過使用SetupAPI,但我還沒有找到一個完整的工作PInvoke模板。

回答

6

我發現了一個適合我們案例的答案,雖然不是通用的答案。我們的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(); 
     } 
    } 
} 
3

這看起來很有前途。

從FDTI網站上可以下載應用程序「重新分配COMNo實用程序」。此應用程序在所有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; } 
    } 

} 
+0

如果有人有問題,那是因爲它的FTDI不是FDTI。 – RW4

相關問題