Serial Port – Enumeración & Disponibilidad - Tambien en C#

 

         Saber sobre la disponibilidad de nuestros puertos serie antes de su selección en un combobox.

  How to know about availability of our computer serial ports before select one from a combo box.

A menudo las aplicaciones que requieren seleccionar un dispositivo antes de efectuar algún tipo de comunicacion, no ofrecen ninguna información adicional sobre el estado del dispositivo. Sobre todo si hablamos del puerto serie, normalmente nos ofrecen una simple enumeración de los COM. Esto último es el causante de que la aplicación nos permita seleccionar un puerto que en ocasiones no existe o está siendo usado por otro programa.

Os propongo una idea con la intención de mejorar y facilitar la selección de este tipo de dispositivos en nuestras aplicaciones.

Básicamente se trata de enumerar en un ‘ComboBox’ personalizado los puertos existentes en nuestro equipo, utilizando el mandato :

My.Computer.Ports.SerialPortNames.ToArray

En el momento de la inicialización del ‘combobox’ asignaremos el evento de ‘DrawItem’ a la función que enriquecerá el aspecto, añadiendo al nombre un rectángulo coloreado y el texto correspondiente a la disponibilidad del puerto.

AddHandler ComboBox1.DrawItem, AddressOf cmbo_SerialPorts_Status

No dudéis en contactar conmigo si necesitáis aclarar o necesitáis entender alguna parte del código.

Para poder darle mayor difusión los comentarios del código están en inglés, aunque si os parece oportuno y necesario puedo posteároslo también en español.

Sometimes our communications applications are required to select any type of external device, and normally these applications are not giving any extra information about their availability. This is the case when talk around serial ports, normally when select the port only have a simple enumeration of COM’s, this may be confusing at time leaving at users selecting inexistent ports or ports that simply are already in use.

With this sample, you can improve and make easy these device selections in our applications.

The main think is enumerate serial port inside our customized ‘ComboBox’, using :

My.Computer.Ports.SerialPortNames.ToArray

After when initialize our combo only need assign ‘DrawItem’ event to function with our personalized combo draw,

AddHandler ComboBox1.DrawItem, AddressOf cmbo_SerialPorts_Status

This function are adding red rectangle and “busy” text when no have availability, and green rectangle and “available” text when the port is free.

Please no doubt in contact with me if you need any other explanation or opinion about this.

 

 SerialEnum_Es

SerialEnum_en 

 

public partial class Form1 : Form
    {
        //Enumerate Serial Ports on Machine
        //Get Serial Port availability
        String[] Puertos = System.IO.Ports.SerialPort.GetPortNames();

 

        public Form1()

        {

            InitializeComponent();

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

            this.comboBox1.DrawMode = DrawMode.OwnerDrawVariable;       //seleccionar mi propio modo de arrastre

            this.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;  //aspecto al men desplegable

            this.comboBox1.DataSource = Puertos;                        //puertos serie disponibles

            this.comboBox1.TabIndex = 0;                                //seleccione en primer lugar tabIndex

        }

 

       

        private void comboBox1_DrawItem_1(object sender, DrawItemEventArgs CmboItem)

        {

            // Dibuja el fondo del item.

            CmboItem.DrawBackground();

            // Los valores por defecto si el puerto est disponible.

            string status = "Disponible";

            SolidBrush brush = new SolidBrush(Color.Green);

            System.Drawing.Font font = this.Font;

            Brush fontbrush = Brushes.Black;

            Rectangle rectangle = new Rectangle(2, CmboItem.Bounds.Top + 2, CmboItem.Bounds.Height - 4, CmboItem.Bounds.Height - 4);

            // Comprobar disponibilidad del puerto

            try

            {

                // Si abre y cierra los puertos sin excepcin.

                // dibuja el item con la fuente por defecto y rectngulo verde.

                System.IO.Ports.SerialPort PortTest = new System.IO.Ports.SerialPort();

                PortTest.PortName = Puertos[CmboItem.Index].ToString();

                PortTest.Open();

                PortTest.Close();

            }

            catch (Exception ex)

            {

                // Si el puerto no est disponible

                // dibuja el item con la fuente cursiva y tachado y rectngulo rojo

                brush = new SolidBrush(Color.Red);

                status = "En Uso";

                font = new Font(FontFamily.GenericSansSerif, this.Font.Size, FontStyle.Italic ^ FontStyle.Strikeout);

                fontbrush = Brushes.DimGray;

            }

            // llenar item combo con rectangulo.

            CmboItem.Graphics.FillRectangle(brush, rectangle);

            // escribir el texto con la condicin actual del puerto de este item.

            CmboItem.Graphics.DrawString(Puertos[CmboItem.Index].ToString() + " - " + status, font, fontbrush, new RectangleF(CmboItem.Bounds.X + rectangle.Width, CmboItem.Bounds.Y, CmboItem.Bounds.Width, CmboItem.Bounds.Height));

            // dibujar foco del rectngulo cuando el ratn est sobre un item.

            CmboItem.DrawFocusRectangle();

        }

    }

 

Comments

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Saturday, November 07, 2009 3:36 AM by alex

disculpa tengo una duda esta parte donde va

My.Computer.Ports.SerialPortNames.ToArray

y esta otra

AddHandler ComboBox1.DrawItem, AddressOf cmbo_SerialPorts_Status

y como le hizo para obtener el combobox1_drawItem1 por favor le agradecere si resp mi duda gracias

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Tuesday, November 10, 2009 4:40 AM by peplluis

Alex,

Disculpa por la confusion... el articulo original estaba escrito en VB, por lo tanto en este no tiene ningun efecto. Asi pues deberias hacer caso omiso a dichas lineas.

Puedes revisar el articulo original en :

msmvps.com/.../serial-port-enumeraci-243-n-amp-disponibilidad.aspx

No dudes en contactar de nuevo si necesitas aclarar cualquier otra duda.

Saludos,

Pep Lluis,

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Friday, January 08, 2010 3:40 PM by Jhonathan Posada

Hola PepLuis, Gracias por este código que tiene metodos que me seran muy utiles. Me gustaría saber como invocas la función comboBox1_DrawItem_1 asociado al evento de dibujar sobre el objeto comboBox1.

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Tuesday, January 12, 2010 11:08 AM by peplluis

Hola Jhonathan,

Cuando utilices el 'event' 'drawitem' desde el diseñador de windows forms, este lo incluira directamente en la funcion 'initialize' del 'form1.designer.cs'. Tambien puedes incluirlo manualmente en 'form-load' usando la expresion :

this.comboBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboBox1_DrawItem);

Saludos,

Pep Lluis,

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Thursday, August 05, 2010 1:11 PM by braulio

Muchas gracias!!! por este ejemplo, justo lo que venia buscando, saludos

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Friday, August 13, 2010 5:39 AM by peplluis

Braulio,

Me alegro que sea util!

Pep Lluis,

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Thursday, March 03, 2011 12:19 AM by Andres

Saludos

¿Como seria el codigo para el boton  enlazar?

¿como selecccionar el COM que este libre?

Gracias

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Thursday, September 08, 2011 2:29 PM by Arnold Calvillo

Tendras el codigo fuente completo?? Ya que me arroja errores el codigo mostrado.

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Sunday, October 09, 2011 6:06 PM by peplluis

Hola Arnold,

Solo tienes que crear un nuevo proyecto para Windows Form en Visual Studio, despues debes substituir el codigo del form1 por el de este ejemplo... deberia funcionar sin ningun problema en otro caso necesitaria saber si al menos estas utilizando visual studio 2005.

Saludos,

PepLluis,

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Thursday, April 26, 2012 5:23 AM by Andreu

Hola PepLluis, perdón por reabrir el tema después de tanto tiempo, pero tengo un problema, estoy intentando hacer funcionar este ejemplo en visual C# 2010, y no lo consigo, tal y como tu dices, copio y pego el codigo, me da errores pero se solucionan agregando un combobox "fisico" en el Form1 "diseño", pero cuando ejecuto el codigo, no me sale nada en el combobox, no se que me puede pasar, tienes idea??

Muchas gracias f-traxx.

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Thursday, April 26, 2012 9:26 AM by peplluis

Hola Adreu,

Efectivamente te faltan dos cosas despues de copiar y pegar :

1) Asignar el evento de "Form_load" desde las propiedades del Form

2) despues de InicializeComponent...

           InitializeComponent();

           comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem_1);

Con esto te funciona bien.

Saludos,

PepLluis,

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Thursday, April 26, 2012 10:40 AM by Andreu

Hola buenas PepLluis, ya lo he hecho, supongo que cuando decias "Asignar el evento de form_load desde las propiedades del form" te referias una acción externa, lo he asignado a la acción de click del mouse, y cuando clickeo, me da un error, concretamente este:

docs.google.com/open

Me puedes decir que está pasando, muchas gracias de nuevo.

Un Saludo Andreu

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Thursday, April 26, 2012 10:45 AM by Andreu

Lo siento en el mensaje de antes lo que queria poner es el enlace de la imangen y me he equivocado, el enlace es este:

docs.google.com/.../edit

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Friday, April 27, 2012 1:23 PM by peplluis

Hola Andreu,

Para este tipo de temas deberiamos transladar la conversación al los foros. En todo caso utiliza la opción [Contact] de las opciones de la derecha, para contactar conmigo en privado y continuar con la conversación.

Saludos,

PepLluis,

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Sunday, November 25, 2012 12:17 PM by JulioC

Disculpa la molestia pero dado que es un excelente ejemplo para el uso de los Puertos seriales, me gustaría saber si para hacerlo correr en un visual C# 2010 necesito agregar o modificar unas lineas del código que muestras, la verdad no tengo mucha experiencia todavía en este lenguaje.

# re: Serial Port – Enumeración & Disponibilidad - Tambien en C#

Wednesday, November 28, 2012 3:02 AM by peplluis

Hola Julio,

Puedes rodarlo tranquilamente en 2010.

Saludos,

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: