2011-09-09 4 views
4

나는 USB 허브에 4 개의 USB 직렬 변환기 (Prolific)를 연결했다. 장치 관리자에서 볼 때 동적으로 할당 된 Com 번호가 표시됩니다. 그러나 허브를 다른 USB 포트에 다시 연결하거나 시스템 리부팅을 한 후 해당 COM 번호가 변경되는 경우가 있습니다. 수를 수동으로 검색하지 않고 모든 변환기의 숫자를 업데이트 할 수 있습니까? 기본적으로 모든 변환기에 대한 고유 한 ID를 찾고 새 COM 번호를 얻는 C# 프로젝트에서 메서드를 갖고 싶습니다. 이 작업을 수행 할 수있는 방법이 있습니까 (성공하지 못했지만 일부 wmi 쿼리를 시도했습니다)?USB 직렬 변환기를 구별하는 방법은 무엇입니까?

오늘 나는 임시 해결책에 대해 생각했다. 그래서 또 다른 질문이 있습니다. USB 허브에 대한 정보를 얻는 방법? 기본적으로 나는 어떻게 든 내 USB 허브를 찾은 다음 허브 포트 장치에 연결된 정보를 검색 할 수 있습니다. 그런 다음 해당 장치의 COM 번호를 가져 오는 것이 wmi 쿼리를 통해 매우 쉽습니다. 나는 그러한 정보를 얻는 것이 가능하다는 것을보기 위해 USBView를 사용했다. 루트 허브 -> 일반 USB 허브 -> 많은 USB-to-serial 통신 포트에서 나무가 보이지만 코드에서이를 수행하는 방법을 알 수 있습니다. 어떤 아이디어?

+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-64bit-platform –

+0

답장을 보내 주셔서 감사합니다. @arun 나는 win32 API 호출을 사용했고 USBView C# 코드를 기반으로 그물에서 발견했습니다. Win32 API에 익숙하지 않았기 때문에 그 점이 도움이되었습니다. (샘플이 동기였습니다.)). 꽤 많은 코드가 있지만 지금은 원하는만큼 훌륭하게 작동합니다. – Falander

관련 문제