2016-10-31 1 views
0

私は組み込みプログラミングには非常に慣れています。リストですべてのポート名を取得しようとしています。私はこれが最も基本的な操作だと思います。Cでポート名を取得する#

using System.IO.Ports;  
string[] ports = SerialPort.GetPortNames(); 

この基本的な操作でどこに絞るかわからないが、文字列は空です。私が間違っていることにつながるものは役に立ちます。

+0

あなたは私たちに関するいくつかの情報を与えることができますあなたが受け取ったエラー? – ivanPfeff

答えて

0

GetPortNamesは有効な接続済みCOMポートのみを収集します。

接続されていないポートのCOMポートを収集する場合は、レジストリを検索する必要があります。ここでは、VIDとPIDに基づいて私が望む正しいデバイスを見つける方法を説明します。

public class ComPortFinder 
{ 
    public static List<DeviceInfo> FindConnectedDevices(uint vid, uint pid) 
    { 
     string pattern = string.Format("^VID_{0:X4}.PID_{1:X4}", vid, pid); 
     Regex _rx = new Regex(pattern, RegexOptions.IgnoreCase); 

     List<DeviceInfo> devices = new List<DeviceInfo>(); 

     RegistryKey rk1 = Registry.LocalMachine; 
     RegistryKey rk2 = rk1.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum"); 

     foreach (String s3 in rk2.GetSubKeyNames()) 
     { 
      RegistryKey rk3 = rk2.OpenSubKey(s3); 
      foreach (String s in rk3.GetSubKeyNames()) 
      { 
       if (_rx.Match(s).Success) 
       { 
        RegistryKey rk4 = rk3.OpenSubKey(s); 
        foreach (String s2 in rk4.GetSubKeyNames()) 
        { 
         RegistryKey rk5 = rk4.OpenSubKey(s2); 
         RegistryKey rk6 = rk5.OpenSubKey("Device Parameters"); 
         if (!string.IsNullOrEmpty((string)rk6.GetValue("PortName"))) 
         { 
          DeviceInfo di = new DeviceInfo() 
          { 
           VenderId = vid, 
           ProductId = pid, 
           SerialNumber = "UNKNOWN", 
           ComPort = rk6.GetValue("PortName").ToString() 
          }; 
          devices.Add(di); 
         } 
        } 
       } 
      } 
     } 
     return devices; 
    } 
} 

public struct DeviceInfo 
{ 
    public uint VenderId; 
    public uint ProductId; 
    public string SerialNumber; 
    public string ComPort; 
} 

私はこれを別のStackOverflowの答えから盗まれましたが、うまくいけば、それが役立つと信じて、私は、このための信用を取ることはありません。

-1

はJuanmaの答えによると、あなたはここで、WMIの楽器を使用して、すべてのポートを取得することができますHow to find available COM ports?

try 
{ 
    ManagementObjectSearcher searcher = 
     new ManagementObjectSearcher("root\\WMI", 
     "SELECT * FROM MSSerial_PortName"); 

foreach (ManagementObject queryObj in searcher.Get()) 
{ 
    Console.WriteLine("-----------------------------------"); 
    Console.WriteLine("MSSerial_PortName instance"); 
    Console.WriteLine("-----------------------------------"); 
    Console.WriteLine("InstanceName: {0}", queryObj["InstanceName"]); 

    Console.WriteLine("-----------------------------------"); 
    Console.WriteLine("MSSerial_PortName instance"); 
    Console.WriteLine("-----------------------------------"); 
    Console.WriteLine("PortName: {0}", queryObj["PortName"]); 

    //If the serial port's instance name contains USB 
    //it must be a USB to serial device 
    if (queryObj["InstanceName"].ToString().Contains("USB")) 
    { 
     Console.WriteLine(queryObj["PortName"] + " 
     is a USB to SERIAL adapter/converter"); 
    } 
} 
} 

catch (ManagementException e) 
{ 
    MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); 
} 

System.Managementの参照を追加することを忘れないでください

+0

OPの組み込みデバイスがWindows CE上で実行されている場合、これは機能しません。 WMIはCE – raidensan

+0

でサポートされていません。あなたは正しいです.WinCEで動作しません。 – FreeMan

関連する問題