• WMI-设备监听-串口


    Console.WriteLine("Ports:");
    foreach (var item in SerialPortService.SerialPortNames)
    {
        Console.Write("	{0}", item);
    }
    Console.WriteLine();
    SerialPortService.SerialPortsChanged += (sender, e) =>
    {
        Console.WriteLine(e.EventType + ", Ports:");
        foreach (var item in SerialPortService.SerialPortNames)
        {
            Console.Write("	{0}", item);
        }
        Console.WriteLine();
    };
    

    /// <summary>
    /// 监测串口变化
    /// </summary>
    public static class SerialPortService
    {
        static SerialPortService()
        {
            _serialPortNames = GetSerialPortNames();
            MonitorDeviceChanges();
        }
    
        private static void MonitorDeviceChanges()
        {
            try
            {
                var arrivalQuery = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
                var removalQuery = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 3");
    
                _arrival = new ManagementEventWatcher(arrivalQuery);
                _arrival.EventArrived += (sender, e) => OnPortsChanged(EventType.Insertion);
                _arrival.Start();
                _removal = new ManagementEventWatcher(removalQuery);
                _removal.EventArrived += (sender, e) => OnPortsChanged(EventType.Removal);
                _removal.Start();
            }
            catch (Exception ex)
            {
                string err = ex.Message;
            }
        }
    
        private static void OnPortsChanged(EventType eventType)
        {
            lock (_serialPortNames)
            {
                var availablePorts = GetSerialPortNames();
                if (!_serialPortNames.SequenceEqual(availablePorts))
                {
                    _serialPortNames = availablePorts;
                    RaiseSerialPortsChanged(eventType);
                }
            }
        }
    
        private static void RaiseSerialPortsChanged(EventType eventType)
        {
            SerialPortsChanged?.Invoke(null, new SerialPortsChangedEventArgs(eventType, _serialPortNames));
        }
    
        private static string[] GetSerialPortNames()
        {
            try
            {
                var curPortNames = System.IO.Ports.SerialPort.GetPortNames();
                return curPortNames;
            }
            catch (Exception ex)
            {
                return Enumerable.Empty<string>().ToArray();
            }
        }
    
        private static string[] _serialPortNames;
        private static ManagementEventWatcher _arrival;
        private static ManagementEventWatcher _removal;
        public static IEnumerable<string> SerialPortNames
        {
            get { return _serialPortNames; }
        }
    
        public static event EventHandler<SerialPortsChangedEventArgs> SerialPortsChanged;
    }
    
  • 相关阅读:
    python中的keys、values、items
    python中的del
    python中的reverse
    python中的remove
    python中的pop
    zookeeper for windows
    express
    js undefine,null 和NaN
    Think_php入口文件配置
    jquery 集合操作
  • 原文地址:https://www.cnblogs.com/wesson2019-blog/p/12218447.html
Copyright © 2020-2023  润新知