Ejemplo n.º 1
0
        /// <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)}");
        }