2011-09-09 35 views
4

我有4個usb串行轉換器(Prolific)連接到USB集線器。當我查看設備管理器時,我看到了動態分配的Com編號。但是在將hub插入另一個usb端口或系統reebot之後,這些com編號有時會改變。有沒有辦法爲每個轉換器更新這些數字,而無需手動搜索這些數字?基本上,我想在我的C#項目中有一個方法,它將爲每個轉換器查找一些唯一的ID,然後獲取新的COM號碼。有沒有辦法做到這一點(嘗試一些wmi查詢,但沒有成功)?如何區分usb串行轉換器?

今天我想到了一種解決方法。所以我有另一個問題。如何獲得有關USB集線器的信息?基本上,我可以以某種方式找到我的USB集線器,然後檢索有關連接到集線器端口設備的信息。然後通過wmi查詢獲得這些設備的com編號將非常容易。我使用USBView來查看是否可以獲取此類信息。我可以看到從根集線器 - >通用USB集線器 - > Prolific USB到串行通信端口開始樹,但是現在如何在代碼中執行此操作。有任何想法嗎?

+1

沒有,USB是一個總線,它不顯示端口號。是的,當你測試時(不是在生產中),這是一個痛苦的問題。除了一個接一個地插入它們並且觀察代碼中的SerialPort.GetPortNames()之外,您所能做的並不多。從設備數據中識別物理設備是最好的解決方案。 –

+0

我不記得很多細節,但創建的每個端口都有一個關聯的註冊表項(位置取決於USB串行芯片的製造商),您應該能夠區分它們。 –

+1

我切換到使用Moxa 8端口PCI串行卡來避免此問題。 –

回答

1

其操作簡單,使用Win32本地電話就可以搞定,

我只是提供了部分代碼,來幫助你,

var guidComPorts = Guid.Empty; 
     UInt32 dwSize; 
     IntPtr hDeviceInfo; 
     var buffer = new byte[512]; 
     var providerName = new[] { }; 
     var spddDeviceInfo = new SpDevinfoData(); 
     var bStatus = SetupDiClassGuidsFromName("Ports", ref guidComPorts, 1, out dwSize); 
     if (bStatus) 
     { 
      hDeviceInfo = SetupDiGetClassDevs(
       ref guidComPorts, 
       (IntPtr)null, 
       (IntPtr)null, 
       DigcfPresent | DigcfProfile); 
      if (hDeviceInfo.ToInt32() != 0) 
      { 

       while (true) 
       { 
        spddDeviceInfo.CbSize = Marshal.SizeOf(spddDeviceInfo);// IS IT THIS LINE WORK FOR 64 BIT       
        bStatus = SetupDiEnumDeviceInfo(hDeviceInfo, nDevice++, ref spddDeviceInfo); 
        break; 
       } 

      } 


      return; 
     } 

    } 

使用此代碼...

發現友好的名字,拆分字符串得到確切的端口,你期待。 我已經完成它,它工作正常,由於一些保密原因無法在這裏提供完整的代碼。

有關詳細查找此鏈接

http://www.codeproject.com/KB/cs/HardwareHelper.aspx

+0

http://stackoverflow.com/questions/5865487/is-it-capable-to-run-on-64-bit-platform –

+0

好的感謝回覆。 @arun我使用win32 api調用,並基於我在網上找到的USBView c#代碼。這是非常有用的,因爲我是win32 api的新手(你的示例是激勵;))。相當多的代碼,但它現在很好,因爲我想。 – Falander

相關問題