C#中的SerialPort類只能通過SerialPort.GetPortNames()來獲取端口名字,而且出來都是COM+數字的字樣,如果我要識別COM端口是什么設備的,它就無能為力了,此時我們可以使用ManagementObjectSearcher獲取所有COM&LPT的port,然后根據名字或者description來識別端口:
try { //{4d36e978-e325-11ce-bfc1-08002be10318}為設備類別port(端口(COM&LPT))的GUID ManagementObjectSearcher searcher = new ManagementObjectSearcher( "root\\CIMV2", "SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\"" ); foreach (ManagementObject queryObj in searcher.Get()) { string name = queryObj.GetPropertyValue("Name").ToString(); string desc = queryObj.GetPropertyValue("Description").ToString(); } } catch (Exception ex) { //Log.w }
如果事先知道某類port的名字特征,如知道Description為“abc”,就可以把ManagementObjectSearcher的第二個參數改為:
try { //{4d36e978-e325-11ce-bfc1-08002be10318}為設備類別port(端口(COM&LPT))的GUID ManagementObjectSearcher searcher = new ManagementObjectSearcher( "root\\CIMV2", "SELECT * FROM Win32_PnPEntity WHERE Name LIKE '%abc%'" ); foreach (ManagementObject queryObj in searcher.Get()) { string name = queryObj.GetPropertyValue("Name").ToString(); string desc = queryObj.GetPropertyValue("Description").ToString(); } } catch (Exception ex) { //Log.w }
這樣就不需要過濾了。
google了半天,有用win32_serialport的,但是不知道問為啥,有些端口識別不出來。