Saltar al contenido

¿Cómo detectar automáticamente el puerto COM de Arduino?

Te doy la bienvenida a proyecto on line, aquí hallarás la respuesta que necesitas.

Solución:

Este pequeño código ha funcionado muy bien para esto (devuelve el puerto COM string, es decir, “COM12” si se detecta Arduino):

private string AutodetectArduinoPort()
        
            ManagementScope connectionScope = new ManagementScope();
            SelectQuery serialQuery = new SelectQuery("SELECT * FROM Win32_SerialPort");
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(connectionScope, serialQuery);

            try
            
                foreach (ManagementObject item in searcher.Get())
                
                    string desc = item["Description"].ToString();
                    string deviceId = item["DeviceID"].ToString();

                    if (desc.Contains("Arduino"))
                    
                        return deviceId;
                    
                
            
            catch (ManagementException e)
            
                /* Do Nothing */
            

            return null;
        

  1. Puede utilizar SerialPort.GetPortNames () para devolver un array de string Nombres de puertos COM.
  2. No creo que pueda detectar automáticamente los puertos, tendría que hacer ping al dispositivo para ver si el dispositivo está conectado.

Llevando la ruta de administración de WMI un poco más lejos, se me ocurrió una clase contenedora que se conecta a los eventos Win32_SerialPorts y llenó dinámicamente una lista de SerialPorts para dispositivos Arduino y Digi International (X-Bee), completa con PortNames y BaudRates.

Por ahora, he usado el campo Descripción de dispositivos en la entrada Win32_SerialPorts como clave para el diccionario, pero esto se puede cambiar fácilmente.

Ha sido probado a una capacidad limitada con un Arduino UNO y parece ser estable.

// -------------------------------------------------------------------------
//  
//      Copyright (c) ApacheTech Consultancy. All rights reserved.
//  
//  
//      This program is free software: you can redistribute it and/or modify
//      it under the terms of the GNU General Public License as published by
//      the Free Software Foundation, either version 3 of the License, or
//      (at your option) any later version.
// 
//      This program is distributed in the hope that it will be useful,
//      but WITHOUT ANY WARRANTY; without even the implied warranty of
//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//      GNU General Public License for more details.
// 
//      You should have received a copy of the GNU General Public License
//      along with this program. If not, see http://www.gnu.org/licenses
//  
// -------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO.Ports;
using System.Linq;
using System.Management;
using System.Runtime.CompilerServices;

// Automatically imported by Jetbeans Resharper
using ArduinoLibrary.Annotations;

namespace ArduinoLibrary

    /// 
    ///     Provides automated detection and initiation of Arduino devices. This class cannot be inherited.
    /// 
    public sealed class ArduinoDeviceManager : IDisposable, INotifyPropertyChanged
    
        /// 
        ///     A System Watcher to hook events from the WMI tree.
        /// 
        private readonly ManagementEventWatcher _deviceWatcher = new ManagementEventWatcher(new WqlEventQuery(
            "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2 OR EventType = 3"));

        /// 
        ///     A list of all dynamically found SerialPorts.
        /// 
        private Dictionary _serialPorts = new Dictionary();

        /// 
        ///     Initialises a new instance of the  class.
        /// 
        public ArduinoDeviceManager()
        
            // Attach an event listener to the device watcher.
            _deviceWatcher.EventArrived += _deviceWatcher_EventArrived;

            // Start monitoring the WMI tree for changes in SerialPort devices.
            _deviceWatcher.Start();

            // Initially populate the devices list.
            DiscoverArduinoDevices();
        

        /// 
        ///     Gets a list of all dynamically found SerialPorts.
        /// 
        /// A list of all dynamically found SerialPorts.
        public Dictionary SerialPorts
        
            get  return _serialPorts; 
            private set
            
                _serialPorts = value;
                OnPropertyChanged();
            
        

        /// 
        ///     Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
        /// 
        public void Dispose()
        
            // Stop the WMI monitors when this instance is disposed.
            _deviceWatcher.Stop();
        

        /// 
        ///     Occurs when a property value changes.
        /// 
        public event PropertyChangedEventHandler PropertyChanged;

        /// 
        ///     Handles the EventArrived event of the _deviceWatcher control.
        /// 
        /// The source of the event.
        /// The  instance containing the event data.
        private void _deviceWatcher_EventArrived(object sender, EventArrivedEventArgs e)
        
            DiscoverArduinoDevices();
        

        /// 
        ///     Dynamically populates the SerialPorts property with relevant devices discovered from the WMI Win32_SerialPorts class.
        /// 
        private void DiscoverArduinoDevices()
        
            // Create a temporary dictionary to superimpose onto the SerialPorts property.
            var dict = new Dictionary();

            try
            
                // Scan through each SerialPort registered in the WMI.
                foreach (ManagementObject device in
                    new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_SerialPort").Get())
                
                    // Ignore all devices that do not have a relevant VendorID.
                    if (!device["PNPDeviceID"].ToString().Contains("VID_2341") && // Arduino
                        !device["PNPDeviceID"].ToString().Contains("VID_04d0")) continue; // Digi International (X-Bee)

                    // Create a SerialPort to add to the collection.
                    var port = new SerialPort();

                    // Gather related configuration details for the Arduino Device.
                    var config = device.GetRelated("Win32_SerialPortConfiguration")
                                       .Cast().ToList().FirstOrDefault();

                    // Set the SerialPort's PortName property.
                    port.PortName = device["DeviceID"].ToString();

                    // Set the SerialPort's BaudRate property. Use the devices maximum BaudRate as a fallback.
                    port.BaudRate = (config != null)
                                        ? int.Parse(config["BaudRate"].ToString())
                                        : int.Parse(device["MaxBaudRate"].ToString());

                    // Add the SerialPort to the dictionary. Key = Arduino device description.
                    dict.Add(device["Description"].ToString(), port);
                

                // Return the dictionary.
                SerialPorts = dict;
            
            catch (ManagementException mex)
            
                // Send a message to debug.
                Debug.WriteLine(@"An error occurred while querying for WMI data: " + mex.Message);
            
        

        /// 
        ///     Called when a property is set.
        /// 
        /// Name of the property.
        [NotifyPropertyChangedInvocator]
        private void OnPropertyChanged([CallerMemberName] string propertyName = null)
        
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        
    

Aquí tienes las comentarios y valoraciones

Si eres capaz, puedes dejar una noticia acerca de qué te ha gustado de esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *