none
Obtener dispositivo conectado a puerto COM RRS feed

  • Pregunta

  • Saben como obtener el nombre del dispositivo conectado a "X" puerto COM? o al revez, sabiendo el nombre del dispositivo, detectar en que puerto esta?

    Porque solo he logrado obtener una lista de puertos, pero no el nombre del dispositivo conectado.

    domingo, 12 de noviembre de 2017 22:09

Respuestas

  • Con carácter general, no es posible. A diferencia de los protocolos USB, que tienen previsto transmitir información acerca del dispositivo conectado, en cambio los puertos COM no contemplan ningún protocolo similar. Cuando se conecta algo al puerto COM, no se transmite nada que identifique al dispositivo; el puerto por sí solo únicamente requiere que se transmitan los datos, que no siguen ningún estándar y son completamente específicos de cada dispositivo individual. Algunos tipos peculiares de dispositivos, como por ejemplo los módems que siguen el estándar AT son capaces de enviar una cadena identificativa si primero los interrogas transmitiéndoles una secuencia adecuada, pero esto no es genérico para cualquier periférico que se conecte a un puerto COM.
    lunes, 13 de noviembre de 2017 7:48
    Moderador
  • Hola EmaAldaz:

    Adquirir el puerto automáticamente si lo conectas tanto físcio y virtuales es así.

    Dentro del Form1_Load, su evento. Usa el componente comboBox. De esta manera obtienes todos los puertos series COM disponibles sin mostrar el nombre.

    Código C#:

            // Detecta USB o puerto serie virtual cuando lo conecta y desconecta del cable.
            protected override void WndProc(ref Message USB)
            {
                if (USB.Msg == 0x219)
                {
                    comboBox_Puerto.DataSource = SerialPort.GetPortNames();
                }
    
                base.WndProc(ref USB); // Detecta si hay cambios en el usb y si los hay los refleja.
            }


            private void Form1_Load(object sender, EventArgs e)
            {
                // Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox.
                comboBox_Puerto.DataSource = SerialPort.GetPortNames();
    
                // Añade puertos disponibles físicos  y virtuales.
                serialPort1.PortName = comboBox_Puerto.Text.ToString();
            }

    Aquí dejo un código que si muestra los nombres del dispositivo conectado sacado de este tutorial pero es de Visual Basic 6, a partir de la página 37.

    Código Visual Basic 6:

    With Me.ComboBoxCOM
        
            Set WMIObjectSet = GetObject("winmgmts:\\.\root\CIMV2").ExecQuery("SELECT * FROM Win32_PnPEntity")
            For Each wmiobject In WMIObjectSet
                If InStr(wmiobject.Name, "COM") Then
                    ComboBoxCOM.AddItem wmiobject.Name
                    
                    nCom = InStrRev(wmiobject.Name, "COM", , vbTextCompare)
                    nCom = Val(Mid(wmiobject.Name, nCom + 3))
        
                    ComboBoxCOM.ItemData(ComboBoxCOM.NewIndex) = nCom
                End If
            Next
            Set WMIObjectSet = Nothing
                
            If ComboBoxCOM.ListCount = 0 Then
                'MsgBox "No se encontraron puertos COM."
                Me.ComboBoxCOM.Clear
                Me.Command_CONECTAR.Enabled = False
                Me.ComboBoxCOM.Enabled = False
               ' Me.Text_Mensajes.Enabled = False
               Me.Text_Mensajes.FontBold = True
               Me.Text_Mensajes.FontSize = 15
                Me.Text_Mensajes.Text = "ERROR " & vbNewLine & "No se encontraron puertos COM."
               ' Me.Enabled = False
                Exit Sub
            End If

    Si logras hacer funcionar en C# los nombres completos de los puertos series conectado, lo hace saber por aquí mostrando el código. Lo he querido saber desde el siglo pasado y nada, solo en VB 6.

    Que tengas mucha suerte.

    PD: Moderadores o administadores. Este tema va incluido en la sección del foro llamado Comunicación con dispositivos externos.



    viernes, 17 de noviembre de 2017 3:42

Todas las respuestas

  • Con carácter general, no es posible. A diferencia de los protocolos USB, que tienen previsto transmitir información acerca del dispositivo conectado, en cambio los puertos COM no contemplan ningún protocolo similar. Cuando se conecta algo al puerto COM, no se transmite nada que identifique al dispositivo; el puerto por sí solo únicamente requiere que se transmitan los datos, que no siguen ningún estándar y son completamente específicos de cada dispositivo individual. Algunos tipos peculiares de dispositivos, como por ejemplo los módems que siguen el estándar AT son capaces de enviar una cadena identificativa si primero los interrogas transmitiéndoles una secuencia adecuada, pero esto no es genérico para cualquier periférico que se conecte a un puerto COM.
    lunes, 13 de noviembre de 2017 7:48
    Moderador
  • Primero que nada, gracias por tu respuesta. 
    Justamente estoy trabajando con un dispositivo que sigue el estándar AT. Es posible que me expliques como obtener esa cadena identificativa? 


    jueves, 16 de noviembre de 2017 23:52
  • Hola EmaAldaz:

    Adquirir el puerto automáticamente si lo conectas tanto físcio y virtuales es así.

    Dentro del Form1_Load, su evento. Usa el componente comboBox. De esta manera obtienes todos los puertos series COM disponibles sin mostrar el nombre.

    Código C#:

            // Detecta USB o puerto serie virtual cuando lo conecta y desconecta del cable.
            protected override void WndProc(ref Message USB)
            {
                if (USB.Msg == 0x219)
                {
                    comboBox_Puerto.DataSource = SerialPort.GetPortNames();
                }
    
                base.WndProc(ref USB); // Detecta si hay cambios en el usb y si los hay los refleja.
            }


            private void Form1_Load(object sender, EventArgs e)
            {
                // Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox.
                comboBox_Puerto.DataSource = SerialPort.GetPortNames();
    
                // Añade puertos disponibles físicos  y virtuales.
                serialPort1.PortName = comboBox_Puerto.Text.ToString();
            }

    Aquí dejo un código que si muestra los nombres del dispositivo conectado sacado de este tutorial pero es de Visual Basic 6, a partir de la página 37.

    Código Visual Basic 6:

    With Me.ComboBoxCOM
        
            Set WMIObjectSet = GetObject("winmgmts:\\.\root\CIMV2").ExecQuery("SELECT * FROM Win32_PnPEntity")
            For Each wmiobject In WMIObjectSet
                If InStr(wmiobject.Name, "COM") Then
                    ComboBoxCOM.AddItem wmiobject.Name
                    
                    nCom = InStrRev(wmiobject.Name, "COM", , vbTextCompare)
                    nCom = Val(Mid(wmiobject.Name, nCom + 3))
        
                    ComboBoxCOM.ItemData(ComboBoxCOM.NewIndex) = nCom
                End If
            Next
            Set WMIObjectSet = Nothing
                
            If ComboBoxCOM.ListCount = 0 Then
                'MsgBox "No se encontraron puertos COM."
                Me.ComboBoxCOM.Clear
                Me.Command_CONECTAR.Enabled = False
                Me.ComboBoxCOM.Enabled = False
               ' Me.Text_Mensajes.Enabled = False
               Me.Text_Mensajes.FontBold = True
               Me.Text_Mensajes.FontSize = 15
                Me.Text_Mensajes.Text = "ERROR " & vbNewLine & "No se encontraron puertos COM."
               ' Me.Enabled = False
                Exit Sub
            End If

    Si logras hacer funcionar en C# los nombres completos de los puertos series conectado, lo hace saber por aquí mostrando el código. Lo he querido saber desde el siglo pasado y nada, solo en VB 6.

    Que tengas mucha suerte.

    PD: Moderadores o administadores. Este tema va incluido en la sección del foro llamado Comunicación con dispositivos externos.



    viernes, 17 de noviembre de 2017 3:42