該方法 GetSerialPort() 透過 WMI (Win32_SerialPort) 列舉系統序列埠,尋找 Name 屬性前 6 字元為 "STMicr" (STMicroelectronics) 的設備,並嘗試提取第 38-42 字元作為結果。
strs.Substring(37, 5) 要求字串長度 ≥ 42,實際 Name 可能更短,會拋出 ArgumentOutOfRangeException。strs 覆寫,最終返回最後一個符合條件的設備片段,而非第一個或所有匹配項。strs 被設為 "No Found",後續匹配設備會被覆蓋為 "No Found"(因 else 分支)。public static string GetStmSerialPortSuffix() {
const string targetPrefix = "STMicr";
const int prefixLen = 6;
const int extractStart = 37;
const int extractLen = 5;
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_SerialPort")) {
foreach (ManagementObject port in searcher.Get()) {
string name = port["Name"]?.ToString() ?? "";
if (name.Length >= prefixLen && name.Substring(0, prefixLen).Equals(targetPrefix, StringComparison.OrdinalIgnoreCase)) {
if (name.Length >= extractStart + extractLen) {
return name.Substring(extractStart, extractLen);
}
// 長度不足時的 fallback:返回可用部分或空
return name.Length > extractStart ? name.Substring(extractStart) : "";
}
}
}
return "Not Found"; // 統一返回語義
}
using 確保 ManagementObjectSearcher 釋放非托管資源。?.ToString() ?? ""。List<string> 收集所有匹配項。Win32_SerialPort 的 DeviceID、PNPDeviceID 等屬性。WMI 查詢雖強大,但返回數據格式不穩定,防禦性編程(長度檢查、空值處理、異常捕獲)是生產級代碼的必修課。