[C#] VID(VenderID),PID(ProductID)를 이용한 SerialPortName 찾기

JEONGKI'S Note·2023년 2월 21일
0
        private const string vidPattern = @"VID_([0-9A-F]{4})";
        private const string pidPattern = @"PID_([0-9A-F]{4})";
        
        struct ComPort // custom struct with our desired values
        {
            public string name;
            public string vid;
            public string pid;
            public string description;
        }
        
        private static List<ComPort> GetConnectedSerialDevices()
        {
            using (var searcher = new ManagementObjectSearcher
               ("SELECT * FROM WIN32_SerialPort"))
            {
                var ports = searcher.Get().Cast<ManagementBaseObject>().ToList();
                return ports.Select(p =>
                {
                    ComPort c = new ComPort();
                    c.name = p.GetPropertyValue("DeviceID").ToString();
                    c.vid = p.GetPropertyValue("PNPDeviceID").ToString();
                    c.description = p.GetPropertyValue("Caption").ToString();

                    Match mVID = Regex.Match(c.vid, vidPattern, RegexOptions.IgnoreCase);
                    Match mPID = Regex.Match(c.vid, pidPattern, RegexOptions.IgnoreCase);

                    if (mVID.Success)
                        c.vid = mVID.Groups[1].Value;
                    if (mPID.Success)
                        c.pid = mPID.Groups[1].Value;

                    return c;

                }).ToList();
            }
        }

        public static string FindSerialName(string VID, string PID)
        {
            // 연될 되어있는 전체 컴포트 리스트 저장
            List<ComPort> ports = GetConnectedSerialDevices();

            // 매개변수인 VID와 PID에 해당하는 포트이름만 불러온다.
            ComPort com = ports.FindLast(c => c.vid.Equals(VID) && c.pid.Equals(PID));
            return com.name;
        }
    }

추가

FindLast를 FindAll로 사용하면 해당 VID와 PID에 해당하는 리스트 전부를 불러온다.

출저
스택오버플로우

profile
주니어 개발자 공부노트입니다 :)

0개의 댓글