/// <summary> /// 找到本机的所有串口 /// </summary> public static void RefreshSerialPorts() { LocalSerialPorts.Clear(); var list = SerialPort.GetPortNames(); //调用WMI,获取Win32_PnPEntity,即所有设备 using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity")) { var hardInfos = searcher.Get(); foreach (var serialName in list) { var des = ""; foreach (var hardInfo in hardInfos) { var name = hardInfo.Properties["Name"].Value; if (name != null) { if (NameContains(name.ToString(), serialName)) //筛选 { des = $"{name} - {hardInfo.Properties["Manufacturer"].Value}"; //获取制造商 } } } if (!LocalSerialPorts.ContainsKey(serialName)) { LocalSerialPorts.Add(serialName, des); } } searcher.Dispose(); } }
public Settings(IConfiguration configuration) { Configuration = configuration; LocalSerialPorts = Array.AsReadOnly(SerialPort.GetPortNames()); TotalSerialPorts = LocalSerialPorts.Count; SortedSet <ushort> portNumbers = new(LocalSerialPorts.Select(portName => ushort.Parse(portName.Substring(3)))); if (portNumbers.Count > 0) { MinPortNumber = portNumbers.First(); MaxPortNumber = portNumbers.Last(); } IConfigurationSection mainSettings = Configuration.GetSection(MainSection); AutoScan = bool.Parse(mainSettings[nameof(AutoScan)]); AutoRemoveIDs = bool.Parse(mainSettings[nameof(AutoRemoveIDs)]); StartComPort = ushort.Parse(mainSettings[nameof(StartComPort)]); EndComPort = ushort.Parse(mainSettings[nameof(EndComPort)]); ComPorts = ParseUniqueUInt16Values(mainSettings[nameof(ComPorts)]); StartIDCode = ushort.Parse(mainSettings[nameof(StartIDCode)]); EndIDCode = ushort.Parse(mainSettings[nameof(EndIDCode)]); IDCodes = ParseUniqueUInt16Values(mainSettings[nameof(IDCodes)]); Rescan = bool.Parse(mainSettings[nameof(Rescan)]); AutoStartParsingSequenceForScan = bool.Parse(mainSettings[nameof(AutoStartParsingSequenceForScan)]); ControllingConnection = bool.Parse(mainSettings[nameof(ControllingConnection)]); SourceConfig = mainSettings[nameof(SourceConfig)]; ResponseTimeout = int.Parse(mainSettings[nameof(ResponseTimeout)]); ConfigFrameTimeout = int.Parse(mainSettings[nameof(ConfigFrameTimeout)]); DisableDataDelay = int.Parse(mainSettings[nameof(DisableDataDelay)]); if (StartComPort == 0) { StartComPort = MinPortNumber; } if (EndComPort == 0) { EndComPort = MaxPortNumber; } if (StartIDCode == 0) { StartIDCode = MinIDCode; } if (EndIDCode == 0) { EndIDCode = MaxIDCode; } IConfigurationSection serialSettings = Configuration.GetSection(SerialSection); BaudRate = int.Parse(serialSettings[nameof(BaudRate)]); DataBits = int.Parse(serialSettings[nameof(DataBits)]); if (Enum.TryParse(serialSettings[nameof(Parity)], out Parity parity)) { Parity = parity; } if (Enum.TryParse(serialSettings[nameof(StopBits)], out StopBits stopBits)) { StopBits = stopBits; } DtrEnable = bool.Parse(serialSettings[nameof(DtrEnable)]); RtsEnable = bool.Parse(serialSettings[nameof(RtsEnable)]); if (ResponseTimeout <= 0) { ResponseTimeout = DefaultResponseTimeout; } if (ConfigFrameTimeout <= 0) { ConfigFrameTimeout = DefaultConfigFrameTimeout; } if (DisableDataDelay <= 0) { DisableDataDelay = DefaultDisableDataDelay; } if (ResponseTimeout < DisableDataDelay) { ResponseTimeout = DisableDataDelay + 500; } string commandLine = Environment.CommandLine; StartStopComPortsFromCommandLine = commandLine.Contains($"--{nameof(StartComPort)}") && commandLine.Contains($"--{nameof(EndComPort)}"); StartStopIDCodesFromCommandLine = commandLine.Contains($"--{nameof(StartIDCode)}") && commandLine.Contains($"--{nameof(EndIDCode)}"); }