How do I get serial Port device id?

后端 未结 1 703
南笙
南笙 2020-12-16 07:58

In this program I\'m first trying to connect to availalbe port. When found and connected, I want to read the connected USB device ID and vendor ID, How do I do that?

相关标签:
1条回答
  • 2020-12-16 08:32

    I finally got this sorted out myself a couple days ago. There are two parts, one to check the registry and another to check the vid/pid of the device.

    The registry method I use just to make sure I don't capture a null modem emulator like com0com.

        /// <summary>
        /// Removes any comm ports that are not explicitly defined as allowed in ALLOWED_TYPES
        /// </summary>
        /// <param name="allPorts">reference to List that will be checked</param>
        /// <returns></returns>
        private static void nullModemCheck(ref List<string> allPorts)
        {
            // Open registry to get the COM Ports available with the system
            RegistryKey regKey = Registry.LocalMachine;
    
            // Defined as: private const string REG_COM_STRING ="HARDWARE\DEVICEMAP\SERIALCOMM";
            regKey = regKey.OpenSubKey(REG_COM_STRING);
    
            Dictionary<string, string> tempDict = new Dictionary<string, string>();
            foreach (string p in allPorts)
                tempDict.Add(p, p);
    
            // This holds any matches we may find
            string match = "";
            foreach (string subKey in regKey.GetValueNames())
            {
                // Name must contain either VCP or Seial to be valid. Process any entries NOT matching
                // Compare to subKey (name of RegKey entry)
                if (!(subKey.Contains("Serial") || subKey.Contains("VCP")))
                {
                    // Okay, this might be an illegal port.
                    // Peek in the dictionary, do we have this key? Compare to regKey.GetValue(subKey)
                    if(tempDict.TryGetValue(regKey.GetValue(subKey).ToString(), out match))         
                    {
                        // Kill it!
                        allPorts.Remove(match);
    
                        // Reset our output string
                        match = "";
                    }
    
                }
    
            }
    
            regKey.Close();
        }
    

    The vid/pid portion was gleaned from techinpro

        /// <summary>
        /// Compile an array of COM port names associated with given VID and PID
        /// </summary>
        /// <param name="VID">string representing the vendor id of the USB/Serial convertor</param>
        /// <param name="PID">string representing the product id of the USB/Serial convertor</param>
        /// <returns></returns>
        private static List<string> getPortByVPid(String VID, String PID)
        {
            String pattern = String.Format("^VID_{0}.PID_{1}", VID, PID);
            Regex _rx = new Regex(pattern, RegexOptions.IgnoreCase);
            List<string> comports = new List<string>();
            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");
                            comports.Add((string)rk6.GetValue("PortName"));
                        }
                    }
                }
            }
            return comports;
        }
    
    0 讨论(0)
提交回复
热议问题