zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    还在使用golang 的map 做Json编码么?
    Golang 性能测试(2) 性能分析
    golang 性能测试 (1) 基准性能测试
    消息队列 NSQ 源码学习笔记 (五)
    消息队列 NSQ 源码学习笔记 (四)
    消息队列 NSQ 源码学习笔记 (三)
    消息队列 NSQ 源码学习笔记 (二)
    消息队列 NSQ 源码学习笔记 (一)
    你不知道的空格
    Supervisor 使用和进阶4 (Event 的使用)
  • 原文地址:https://www.cnblogs.com/wesson2019-blog/p/12218447.html
Copyright © 2011-2022 走看看