visual serialport1 serialport serial readexisting puertos puerto metodo listar datareceived c# visual-studio events serial-port port

c# - serialport1 - Nuevo evento disponible de puerto COM



serialport1 readline c# (3)

Cree una aplicación de formulario simple y coloque el siguiente código en el formulario:

protected override void WndProc(ref Message m) { switch (m.Msg) { case 537: //WM_DEVICECHANGE var ports = SerialPort.GetPortNames().OrderBy(name => name); foreach (var portName in ports) { Debug.Print(portName); } break; } base.WndProc(ref m); }

Mi aplicación C # usa los puertos COM. Estoy teniendo algunas dificultades que deberían ser comunes para la mayoría de los programas. Necesito obtener un evento cuando la lista de Portnames cambia. Tengo un cuadro de selección donde el usuario puede elegir de la lista de nombres de puertos disponibles. ¿Alguien tiene un fragmento de código para esto? Gracias.


El cambio de puertos COM es un evento raro, no común.

La manera más fácil sería tener un temporizador y cada 10-30 segundos enumerar la lista de puertos COM y, si se modifican, actualizar la lista.

Mejor aún, proporcione un botón de "actualizar lista": la lista básicamente solo cambiará si el usuario conectó un adaptador serie USB.


También se puede hacer con la ayuda de "ManagementEventWatcher":

using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel.Composition; using System.Linq; using System.Text; using System.Management; using System.IO.Ports; using System.Threading; using System.Threading.Tasks; namespace HmxFlashLoader { /// <summary> /// Make sure you create this watcher in the UI thread if you are using the com port list in the UI /// </summary> [Export] [PartCreationPolicy(CreationPolicy.Shared)] public sealed class SerialPortWatcher : IDisposable { public SerialPortWatcher() { _taskScheduler = TaskScheduler.FromCurrentSynchronizationContext(); ComPorts = new ObservableCollection<string>(SerialPort.GetPortNames().OrderBy(s => s)); WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent"); _watcher = new ManagementEventWatcher(query); _watcher.EventArrived += (sender, eventArgs) => CheckForNewPorts(eventArgs); _watcher.Start(); } private void CheckForNewPorts(EventArrivedEventArgs args) { // do it async so it is performed in the UI thread if this class has been created in the UI thread Task.Factory.StartNew(CheckForNewPortsAsync, CancellationToken.None, TaskCreationOptions.None, _taskScheduler); } private void CheckForNewPortsAsync() { IEnumerable<string> ports = SerialPort.GetPortNames().OrderBy(s => s); foreach (string comPort in ComPorts) { if (!ports.Contains(comPort)) { ComPorts.Remove(comPort); } } foreach (var port in ports) { if (!ComPorts.Contains(port)) { AddPort(port); } } } private void AddPort(string port) { for (int j = 0; j < ComPorts.Count; j++) { if (port.CompareTo(ComPorts[j]) < 0) { ComPorts.Insert(j, port); break; } } } public ObservableCollection<string> ComPorts { get; private set; } #region IDisposable Members public void Dispose() { _watcher.Stop(); } #endregion private ManagementEventWatcher _watcher; private TaskScheduler _taskScheduler; }

}