2012-08-14 2 views
1

다음 코드는 세 개의 직렬 포트 (com3, com4 및 com5) 만 반환합니다. 내가 액세스하고자하는 펌웨어는 USB 플러그 멀티 플라이어에 있습니다. 이 멀티 플라이어의 직렬 포트에 어떻게 액세스 할 수 있습니까? 그리고 정보를 보내려는 펌웨어가 들어있는 특정 USB를 어떻게 식별 할 수 있습니까?특정 직렬 포트를 찾는 방법은 무엇입니까?

using System; 
using System.IO.Ports; 

namespace SerialPortExample 
{ 
    class SerialPortExample 
    { 
     public static void Main() 
     { 
      string[] ports = SerialPort.GetPortNames(); 
      Console.WriteLine("The following serial ports were found:"); 
      foreach (string port in ports) 
      { 
       Console.WriteLine(port); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

미리 감사드립니다.

+0

이는 USB 드라이브입니다? H처럼 : 또는 이와 비슷한가요? –

+0

먼저 가상 COM 포트를 만들기 위해서는 소프트웨어가 필요하다고 생각합니다. – Reniuz

+0

@DorCohen 어떻게 볼 수 있습니까? –

답변

2

이것은 상당히 큰 사용성 문제이며 USB 드라이버가 바로 가기를 사용하고 직렬 포트를 에뮬레이트하여 인터페이스를 쉽게하기 때문에 발생합니다. 직렬 포트는 매우 원시적 인 장치이므로 API를 매우 쉽게 사용할 수 있습니다. 그러나 플러그 앤 플레이에 대한 지원이 없기 때문에 적절한 알림을받을 방법이 없습니다. 드라이버는 임의의 포트 번호를 선택하기 만하고 어떤 포트 번호인지 파악하는 것은 사용자의 몫입니다. 시행 착오입니다. 이것은 문제가되지 않았지만 직렬 포트에는 컴퓨터의 후면 패널에 COM 포트 이름이 명확하게 표시된 커넥터가 장착되어 있습니다.

WMC에서 약간의 마일리지를 얻을 수 있으므로 Win32_SerialPort query으로 직렬 포트 장치를 열거 할 수 있습니다. 당신이 얻는 것은 상당히 예측할 수 없으며, 그것은 운전자가 데이터를 제공하는 것에 달려 있습니다. WMI Code Creator 유틸리티를 사용하면 가장 좋은 방법을 실험 할 수 있으며 필요한 C# 코드를 자동으로 생성 할 수도 있습니다. 불행히도 다운로드 위치를 더 이상 찾을 수 없습니다. 지난 몇 주 동안 삭제 된 것으로 보입니다. 희망을 찾을 수있는 대안.

+0

고맙습니다. driveinfo linq] (http://stackoverflow.com/questions/6003822/how-to-detect-a-usb-device-has-been-plugged-in) alternative? –

+1

이동식 드라이브를 에뮬레이션하는 USB 장치는 직렬 포트 에뮬레이터와 매우 다릅니다. 드라이브는 플러그 앤 플레이 이벤트를 생성합니다. –

+0

감사합니다. 손으로, 아마도 driveinfo.getdrives() 메소드를 사용하는 것이 가장 좋습니다. 나는 새로운 해결책으로 나의 새로운 투쟁으로 새로운 [토론] (http://stackoverflow.com/questions/11953364/why-is-the-command-prompt-disappearing-after-loading#11953592)을 시작했다. –

0

아래의 코드는 특정 포트를 찾는 좋은 일을 수행합니다

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Management; 
using System.Windows.Forms; 
namespace MyNamespace 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyClass x = new MyClass(); 
      var com = x.GetCOMs(); 
      foreach (string port in com) 
      { 
       Console.WriteLine(port); 
      } 
      Console.ReadLine(); 
     } 

    } 

    class MyClass 
    { 
     public List<string> GetCOMs() 
     { 
      List<string> coms = new List<string>(); 
      try 
      { 
       ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", 
       "SELECT * FROM Win32_PnPEntity WHERE ConfigManagerErrorCode = 0"); 

       foreach (ManagementObject obj in searcher.Get()) 
       { 
        object captionObj = obj["Caption"]; 
        if (captionObj != null) 
        { 
         string caption = captionObj.ToString(); 
         if (caption.Contains("(COM")) 
         { 
          coms.Add(caption); 
         } 
        } 
       } 

       m_ParseCOMs(ref coms); 
      } 
      catch (ManagementException ex) 
      { 
       MessageBox.Show("An error occurred while querying for WMI data: " + ex.Message); 
       return coms; 
      } 

      return coms; 
     } 

     private void m_ParseCOMs(ref List<string> comPorts) 
     { 
      string[] temp; 
      List<string> temp2 = new List<string>(); 
      int index = 0; 
      foreach (string s in comPorts) 
      { 
       string temp3 = ""; 
       temp = s.Split(' '); 
       temp3 += temp[temp.Length - 1] + " - "; 
       for (int i = 0; i < temp.Length - 1; i++) 
       { 
        temp3 += temp[i] + " "; 
       } 
       temp2.Insert(index, temp3); 
       index++; 
      } 
      comPorts = temp2; 
     } 
    } 
} 
관련 문제