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;
}