private void RefreshCSerialPorts_Click(object sender, RoutedEventArgs e)
        {
            var refreshedPorts = OutputSerialDeviceHandler.GetPorts();

            SerialPorts.Clear();
            foreach (var port in refreshedPorts)
            {
                SerialPorts.Add(port);
            }
        }
Exemple #2
0
        public async Task RefreshSerialPortsAsync()
        {
            var activePorts = SerialPorts.Where(p => p.IsActive).Select(p => p.PortID).ToList();

            SerialPorts.Clear();
#if NETFX_CORE
            var serialPortSelector = Windows.Devices.SerialCommunication.SerialDevice.GetDeviceSelector();
            var devices            = await DeviceInformation.FindAllAsync(serialPortSelector);

            foreach (var item in devices)
            {
                bool isActive = activePorts.Contains(item.Id);
                SerialPorts.Add(new SerialPortInfo(item.Id, item.Name, isActive));
                if (isActive)
                {
                    activePorts.Remove(item.Id);
                }
            }
#else //.NET
            foreach (var item in System.IO.Ports.SerialPort.GetPortNames())
            {
                bool isActive = activePorts.Contains(item);
                SerialPorts.Add(new SerialPortInfo(item, item, isActive));
                if (isActive)
                {
                    activePorts.Remove(item.Id);
                }
            }
#endif
#if DEBUG
            // SerialPorts.Add(new SerialPortInfo("//COM-TEST/1", "Test Port 1"));
            // SerialPorts.Add(new SerialPortInfo("//COM-TEST/2", "Test Port 2"));
            // SerialPorts.Add(new SerialPortInfo("//COM-TEST/3", "Test Port 3"));
            // SerialPorts.Add(new SerialPortInfo("//COM-TEST/4", "Test Port 4"));
#endif

            // Remove controllers on ports that were active but lost
            foreach (var item in activePorts)
            {
                Watcher.Instance.RemoveController(item);
            }
        }
    public async Task RefreshPorts()
    {
        var token = _cancellationSource.Token;

        IsRefreshBusy = true;
        await Task.Delay(750, token).ConfigureAwait(true);

        var lastSelectedDeviceId = SelectedSerialPortDeviceId;

        SerialPorts.Clear();
        try
        {
            var scope    = new ManagementScope("\\\\.\\ROOT\\cimv2");
            var observer = new ManagementOperationObserver();
            using var searcher = new ManagementObjectSearcher(scope, new SelectQuery("Win32_PnPEntity"));

            observer.ObjectReady += (_, e) =>
            {
                var portInfo = SerialPortInfo.FromManagementObject(e.NewObject as ManagementObject);
                if (portInfo == null)
                {
                    return;
                }

                SerialPorts.Add(portInfo);
            };

            var taskCompletion = new TaskCompletionSource();
            observer.Completed += (_, _) => taskCompletion.TrySetResult();

            searcher.Get(observer);
            using (token.Register(() => taskCompletion.TrySetCanceled()))
                await taskCompletion.Task.WaitAsync(token).ConfigureAwait(true);
        }
        catch { }

        SelectSerialPortByDeviceId(lastSelectedDeviceId);
        await Task.Delay(250, token).ConfigureAwait(true);

        IsRefreshBusy = false;
    }