Diseño interfaz con VB 6

De la forma en como estás seleccionando el puerto en el ComboBox, no estás seleccionando el número correcto.

Al puerto 1 si lo seleccionas bien: Ver el archivo adjunto 127756

Pero del puerto COM2 en adelante, ya no es el número de puerto correcto: Ver el archivo adjunto 127757 [/URL]

Pero se supone que el numero del puerto se guarda en el itemdata
en esta linea
Código:
    ComboBoxCOM.ItemData(ComboBoxCOM.NewIndex) = nCom

por eso despues cuando conecta usa esto para sacar el numero de puerto

MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex)

lo probe con puertos com superiores a 10 y funciona bien

bueno como sea

el evento Private Sub ComboBoxCOM_Click() sobra
quedaria mejor asi



Código:
Private Sub Command_CONECTAR_Click()
   If Not MSComm_Puerto_Serie.PortOpen Then
[B] MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex) [/B]
 
       MSComm_Puerto_Serie.PortOpen = True ' Abrir puerto serie.
       Command_CONECTAR.Caption = "DESCONECTAR" ' Mostrar texto en el botón.
       ComboBoxCOM.Enabled = False
       Command_Led_8_ON.Enabled = True ' Activar botón ON.
       Command_Led_8_OFF.Enabled = True ' Activar botón OFF.
    Else
       MSComm_Puerto_Serie.PortOpen = False ' Cerrar puerto serie.
       Command_CONECTAR.Caption = "CONECTAR" ' Mostrar texto en el botón.
       ComboBoxCOM.Enabled = True
       Command_Led_8_ON.Enabled = False ' Desactivar botón ON.
       Command_Led_8_OFF.Enabled = False ' Desactivar botón OFF.
    End If
End Sub

y

s
Usa esta función para obtener el número del puerto eleccionado en el ComboBox:
Código:
[COLOR=Blue]Private Function[/COLOR] Get_CommPort(ComboPuertos [COLOR=Blue]As[/COLOR] ComboBox) [COLOR=Blue]As Integer[/COLOR]
   [COLOR=Green] ' Obtener y retornar únicamente el número del puerto seleccionado.[/COLOR]
    [COLOR=Blue]Dim[/COLOR] StrPos%
    [COLOR=Blue]Dim[/COLOR] Cadena$
    StrPos = InStr(1, ComboPuertos.Text, "(")
    
   [COLOR=Blue] If [/COLOR]StrPos [COLOR=Blue]Then[/COLOR]
        Cadena = [COLOR=Blue]CStr([/COLOR]Mid(ComboPuertos.Text, StrPos, 6)[COLOR=Blue])[/COLOR]
        Get_CommPort = [COLOR=Blue]CStr([/COLOR]Val(Mid(Cadena, 5, 2))[COLOR=Blue])[/COLOR]
    [COLOR=Blue]Else[/COLOR]
        Get_CommPort = 0
    [COLOR=Blue]End If[/COLOR]
[COLOR=Blue]End Function[/COLOR]
El valor de retorno es el número encontrado en la cadena del primer "COMX"

Y así llamas a la función:
Código:
    Variable = Get_CommPort(El_ComboBox)
Si retorna un número diferente a 0, todo bien y sigues, si retorna 0, algo va mal y das aviso.

Saludos.

usando matrices sale mas facil
Código:
Function CommPort(cadena As String) As Integer
Dim matrix() As String
matrix = Split(cadena, "(COM")
If UBound(matrix) > 0 Then
CommPort= Replace(matrix(1), ")", "")
 Else: CommPort= 0
End If
End Function
 
Última edición:
¿Puedes poner el código completo con ese trozo de código?
Claro, pero para que lo entiendas mejor, adjunto un ejemplo.

Pero se supone que el número del puerto se guarda en el ItemData,
en esta línea:
Código:
    ComboBoxCOM.ItemData(ComboBoxCOM.NewIndex) = nCom
por eso despues cuando Conecta usa esto para sacar el número de puerto.
Esa es la forma en como Meta lo está haciendo, yo uso otra forma.
Lo probé con puertos COM superiores a 10 y funciona bien.
Adjunté unas fotos al respecto para demostrar que no siempre se obtiene el puerto correcto de esa forma.
Usando matrices sale más fácil.
No es que sea más fácil así, es sólo otra forma de hacerlo. :cool:

Saludos.
 

Adjuntos

  • Ejemplo ComboBox para MSCOMM.rar
    2.6 KB · Visitas: 15
Buenas:

Me estoy liando... :D:D:D:D:D

Dejo el códig que aparentemente funciona bien. He modificado como dice analógico algo y en vez de usar Led_8_ON y Led_8_OFF esos 8 lo he cambiado por : Led_13_ON y Led_13_OFF ya que tengo conectado Arduino UNO y Arduino Micro.

He cambiado.
Código:
MsgBox "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
por
Código:
    Label_Mensaje_Puerto_Seleccionado.Caption = "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
Le he puesto abajo un label nuevo para que no me salga en pantalla los mensajes y tenga que pulsar Aceptar, así no lo veo tan incómodo.

El código compelto que tengo hecho por ahora es este.

Me funciona bien, he comprobado los dos Arduinos y funcioina bien.
LOCO.jpg
Código:
'Option Explicit

Private Sub Form_Load()

    Dim nCom%   ' Buscamos el número del puerto:
    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
     '###########################################################################

        ' Para seleccionar el primer puerto encontrado:
        ComboBoxCOM.ListIndex = 0
    End With
End Sub

Private Sub ComboBoxCOM_Click()
    ' Configurar MSComm
    With Me.ComboBoxCOM
        MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex)
    End With
    ' D@rkbytes ###########################################################################
    Debug.Print "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    'MsgBox "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    Label_Mensaje_Puerto_Seleccionado.Caption = "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    '###########################################################################
End Sub

' Si ya has seleccionado un puerto en el comboBox
' Si pulsas conectar abre el puerto y si no lo cierra.
Private Sub Command_CONECTAR_Click()
    If Not MSComm_Puerto_Serie.PortOpen Then
    ' analogico ###########################################################################
     MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex)
    '###########################################################################
       MSComm_Puerto_Serie.PortOpen = True ' Abrir puerto serie.
       Command_CONECTAR.Caption = "DESCONECTAR" ' Mostrar texto en el botón.
       ComboBoxCOM.Enabled = False
       Command_Led_8_ON.Enabled = True ' Activar botón ON.
       Command_Led_8_OFF.Enabled = True ' Activar botón OFF.
    Else
       MSComm_Puerto_Serie.PortOpen = False ' Cerrar puerto serie.
       Command_CONECTAR.Caption = "CONECTAR" ' Mostrar texto en el botón.
       ComboBoxCOM.Enabled = True
       Command_Led_8_ON.Enabled = False ' Desactivar botón ON.
       Command_Led_8_OFF.Enabled = False ' Desactivar botón OFF.
    End If
End Sub

Private Sub Command_Led_8_OFF_Click()
' Envía este cadena de carácter por el puerto serie.
    MSComm_Puerto_Serie.Output = "Led_13_OFF"
End Sub

Private Sub Command_Led_8_ON_Click()
' Envía este cadena de carácter por el puerto serie.
    MSComm_Puerto_Serie.Output = "Led_13_ON"
End Sub
El único problema que le veo que que cuando dejo este código desde el principio.
Código:
Option Explicit
Al ejecutar me sale este error.
dsf.jpg

Me señala aquí siempre.
fsdafasdfsad.png

¿A ustedes les pasa?

Si dejo documentado así:
Código:
'Option Explicit

Funciona de maravilla.
Por lo que veo en el código general, funciona bien y lo he comprobado. Ahora solo falta, bajo mi punto devista, quitar el label que puse nuevo para saber si realmente selecciona los puertos, cosa que haré al final de todo cuando esté al 100 % seguro de que funciona y, la entradas de datos del puerto serie, cuando Arduino envías tramas de bytes que dice: "Led 13 a sido apagado". Solo recibe mensajes.

Les dejo el proyecto para que lo descarguen, analicen más a fondo y cómodo..
 

Adjuntos

  • InterDuinoVB6.rar
    8 KB · Visitas: 10
Buenas:

Me estoy liando... :D:D:D:D:D

Dejo el códig que aparentemente funciona bien. He modificado como dice analógico algo y en vez de usar Led_8_ON y Led_8_OFF esos 8 lo he cambiado por : Led_13_ON y Led_13_OFF ya que tengo conectado Arduino UNO y Arduino Micro.

He cambiado.
Código:
MsgBox "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
por
Código:
    Label_Mensaje_Puerto_Seleccionado.Caption = "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
Le he puesto abajo un label nuevo para que no me salga en pantalla los mensajes y tenga que pulsar Aceptar, así no lo veo tan incómodo.

El código compelto que tengo hecho por ahora es este.

Me funciona bien, he comprobado los dos Arduinos y funcioina bien.
Ver el archivo adjunto 127866
Código:
'Option Explicit

Private Sub Form_Load()

    Dim nCom%   ' Buscamos el número del puerto:
    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
     '###########################################################################

        ' Para seleccionar el primer puerto encontrado:
        ComboBoxCOM.ListIndex = 0
    End With
End Sub

Private Sub ComboBoxCOM_Click()
    ' Configurar MSComm
    With Me.ComboBoxCOM
        MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex)
    End With
    ' D@rkbytes ###########################################################################
    Debug.Print "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    'MsgBox "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    Label_Mensaje_Puerto_Seleccionado.Caption = "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    '###########################################################################
End Sub

' Si ya has seleccionado un puerto en el comboBox
' Si pulsas conectar abre el puerto y si no lo cierra.
Private Sub Command_CONECTAR_Click()
    If Not MSComm_Puerto_Serie.PortOpen Then
    ' analogico ###########################################################################
     MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex)
    '###########################################################################
       MSComm_Puerto_Serie.PortOpen = True ' Abrir puerto serie.
       Command_CONECTAR.Caption = "DESCONECTAR" ' Mostrar texto en el botón.
       ComboBoxCOM.Enabled = False
       Command_Led_8_ON.Enabled = True ' Activar botón ON.
       Command_Led_8_OFF.Enabled = True ' Activar botón OFF.
    Else
       MSComm_Puerto_Serie.PortOpen = False ' Cerrar puerto serie.
       Command_CONECTAR.Caption = "CONECTAR" ' Mostrar texto en el botón.
       ComboBoxCOM.Enabled = True
       Command_Led_8_ON.Enabled = False ' Desactivar botón ON.
       Command_Led_8_OFF.Enabled = False ' Desactivar botón OFF.
    End If
End Sub

Private Sub Command_Led_8_OFF_Click()
' Envía este cadena de carácter por el puerto serie.
    MSComm_Puerto_Serie.Output = "Led_13_OFF"
End Sub

Private Sub Command_Led_8_ON_Click()
' Envía este cadena de carácter por el puerto serie.
    MSComm_Puerto_Serie.Output = "Led_13_ON"
End Sub
El único problema que le veo que que cuando dejo este código desde el principio.
Código:
Option Explicit
Al ejecutar me sale este error.
Ver el archivo adjunto 127867

Me señala aquí siempre.
Ver el archivo adjunto 127868

¿A ustedes les pasa?

Si dejo documentado así:
Código:
'Option Explicit

Funciona de maravilla.
Por lo que veo en el código general, funciona bien y lo he comprobado. Ahora solo falta, bajo mi punto devista, quitar el label que puse nuevo para saber si realmente selecciona los puertos, cosa que haré al final de todo cuando esté al 100 % seguro de que funciona y, la entradas de datos del puerto serie, cuando Arduino envías tramas de bytes que dice: "Led 13 a sido apagado". Solo recibe mensajes.

Les dejo el proyecto para que lo descarguen, analicen más a fondo y cómodo..

no entiendo nada de led13

pero el error option explicit es por que falta declarar las variables en el evento load
Código:
Dim WMIObjectSet As Object
    Dim wmiobject As Object


y al colocar en el boton conectar
Código:
###########################################################################
     MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex)
    '###############################################################
el evento clic sobra pero no afecta en el funcionanmiento


y
Código:
Label_Mensaje_Puerto_Seleccionado.Caption = "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort

puedes usar el mismo cuadro de texto grande para todos los mensajes
Código:
Label_Mensaje_Puerto_Seleccionado.Caption = "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort

Código:
Me.Text_Mensajes.Text="Conectado al : COM" & MSComm_Puerto_Serie.CommPort & vbnewline

y falta un limpia texto
Código:
Me.Text_Mensajes.Text=""
 
Buenas:

El Led 13 hacer referencia al pin 13 del Arduino UNO y Micro, ya que en la propia placa viene integrado para hacer pruebas, como el parpadero de un Led.

just_arduino_led_high.png


Eso es lo que me refiero el Led 13.

Pues si, por fin funciona bien.
Código:
' Variables del evento load.
    Dim WMIObjectSet As Object
    Dim wmiobject As Object

Código completo.
Código:
Option Explicit

' Variables del evento load.
    Dim WMIObjectSet As Object
    Dim wmiobject As Object

Private Sub Form_Load()

    Dim nCom%   ' Buscamos el número del puerto:
    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
     '###########################################################################

        ' Para seleccionar el primer puerto encontrado:
        ComboBoxCOM.ListIndex = 0
    End With
End Sub

Private Sub ComboBoxCOM_Click()
    ' Configurar MSComm
    With Me.ComboBoxCOM
        MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex)
    End With
    ' D@rkbytes ###########################################################################
    Debug.Print "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    'MsgBox "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    Label_Mensaje_Puerto_Seleccionado.Caption = "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    '###########################################################################
End Sub

' Si ya has seleccionado un puerto en el comboBox
' Si pulsas conectar abre el puerto y si no lo cierra.
Private Sub Command_CONECTAR_Click()
    If Not MSComm_Puerto_Serie.PortOpen Then
    ' analogico ###########################################################################
     MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex)
    '###########################################################################
       MSComm_Puerto_Serie.PortOpen = True ' Abrir puerto serie.
       Command_CONECTAR.Caption = "DESCONECTAR" ' Mostrar texto en el botón.
       ComboBoxCOM.Enabled = False
       Command_Led_8_ON.Enabled = True ' Activar botón ON.
       Command_Led_8_OFF.Enabled = True ' Activar botón OFF.
    Else
       MSComm_Puerto_Serie.PortOpen = False ' Cerrar puerto serie.
       Command_CONECTAR.Caption = "CONECTAR" ' Mostrar texto en el botón.
       ComboBoxCOM.Enabled = True
       Command_Led_8_ON.Enabled = False ' Desactivar botón ON.
       Command_Led_8_OFF.Enabled = False ' Desactivar botón OFF.
    End If
End Sub

Private Sub Command_Led_8_OFF_Click()
' Envía este cadena de carácter por el puerto serie.
    MSComm_Puerto_Serie.Output = "Led_13_OFF"
End Sub

Private Sub Command_Led_8_ON_Click()
' Envía este cadena de carácter por el puerto serie.
    MSComm_Puerto_Serie.Output = "Led_13_ON"
End Sub

He comrpobado que funciona todo, con las variables esas también.
¿Falta algo más antes de empezar con la entrada de datos del puerto serie?

Saludos.
 
las Variables del evento load las
deberian ir en el eveto load por que es el unico lugar donde se usan
es cosa del ambito de las variables y la optimizacion del programa
 
Entonces así:

Código:
Option Explicit

Private Sub Form_Load()
    Dim WMIObjectSet As Object ' Variables del evento load.
    Dim wmiobject As Object
    Dim nCom%   ' Buscamos el número del puerto:
    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
     '###########################################################################

        ' Para seleccionar el primer puerto encontrado:
        ComboBoxCOM.ListIndex = 0
    End With
End Sub

Private Sub ComboBoxCOM_Click()
    ' Configurar MSComm
    With Me.ComboBoxCOM
        MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex)
    End With
    ' D@rkbytes ###########################################################################
    Debug.Print "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    'MsgBox "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    Label_Mensaje_Puerto_Seleccionado.Caption = "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    '###########################################################################
End Sub

' Si ya has seleccionado un puerto en el comboBox
' Si pulsas conectar abre el puerto y si no lo cierra.
Private Sub Command_CONECTAR_Click()
    If Not MSComm_Puerto_Serie.PortOpen Then
    ' analogico ###########################################################################
     MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex)
    '###########################################################################
       MSComm_Puerto_Serie.PortOpen = True ' Abrir puerto serie.
       Command_CONECTAR.Caption = "DESCONECTAR" ' Mostrar texto en el botón.
       ComboBoxCOM.Enabled = False
       Command_Led_8_ON.Enabled = True ' Activar botón ON.
       Command_Led_8_OFF.Enabled = True ' Activar botón OFF.
    Else
       MSComm_Puerto_Serie.PortOpen = False ' Cerrar puerto serie.
       Command_CONECTAR.Caption = "CONECTAR" ' Mostrar texto en el botón.
       ComboBoxCOM.Enabled = True
       Command_Led_8_ON.Enabled = False ' Desactivar botón ON.
       Command_Led_8_OFF.Enabled = False ' Desactivar botón OFF.
    End If
End Sub

Private Sub Command_Led_8_OFF_Click()
' Envía este cadena de carácter por el puerto serie.
    MSComm_Puerto_Serie.Output = "Led_13_OFF"
End Sub

Private Sub Command_Led_8_ON_Click()
' Envía este cadena de carácter por el puerto serie.
    MSComm_Puerto_Serie.Output = "Led_13_ON"
End Sub

¿Ya se puede urgar en los datos de entrada del puerto serie?

Espero que no sea tan complicado como todo esto.

Saludos.
 
Por lo que veo, hay que suar input. Luego almacenarlo en una variable todo lo que entra en input y soltarlo en el text. Cosa que se dice pronto, espero no tener que hacerlo difícil. :=

Voy a por ello...

Muchas gracias a todos.
 
Hola:

Analizando el código de nuestro amigo con su programa que recomendó, tenemos esto:

Código:
Private Sub RS232_OnComm()
    ' Recibir los datos del puerto serie
    Dim szData$
    Dim sNum As Byte
    Dim x%
    Select Case RS232.CommEvent
        ' Evento de recepción de datos
        Case comEvReceive
            ' Leer datos del puerto
            szData = RS232.Input

            If mnuExtras(2).Checked = True Then
                szData = RemoveChar(szData, Chr(13))
                szData = RemoveChar(szData, Chr(10))
            End If

            On Error GoTo ErrDep

            If optRxOptions(0) Then
                ' Mostrar los datos de entrada con valor binario de 8 bits.
                txtRX.Text = txtRX.Text & DecToBin(Asc(szData), 8) & " "
            End If
    
            If optRxOptions(1) Then
                ' Si se checa la opción Decimal, mostrar el número ASCII.
                    txtRX.Text = txtRX.Text & Asc(szData) & " "
            End If
    
            If optRxOptions(2) Then
                ' Si se checa la opción Hexadecimal, mostrar el número Hex.
                txtRX.Text = txtRX.Text & Hex(Asc(szData)) & " "
            End If
    
            If optRxOptions(3) Then
                ' Mostrar lo que se ingresa.
                txtRX.Text = txtRX.Text & szData
            End If
    
            If optRxOptions(4) Then
                ' Convertir los datos recibidos a bytes para mostrarlos en los LED's.
                sNum = Asc(szData)
                For x = 7 To 0 Step -1
                    If sNum And 2 ^ x Then
                        chkSW(x).Value = 1
                    Else
                        chkSW(x).Value = 0
                    End If
                    chkSW(x).Refresh
                Next x
            End If
 
        Case comEvEOF
            txtRX.Text = txtRX.Text & _
            "Se produjo una detección de fin de archivo." & vbCrLf
    End Select
    
    txtRX.SelStart = Len(txtRX.Text)

ErrDep: ' Depuración de errores
    If Err.Number <> 0 Then
        txtRX.Text = "Ocurrio un error durante la recepción de datos." & vbCrLf & _
        "Descripción: " & Err.Description
        Err.Clear
        Exit Sub
    End If
End Sub
Mi opinión personal. Aquí veo mucho profesionalidad.

Lo que busco es básico, solo que al llegar desde Arduino, PIC o un simple PC datos o mensajes de texto y que se muestre en el Tesxt.

Mi intención es usar esto:
Código:
Private Sub MSComm_Puerto_Serie()
    MSComm_Puerto_Serie.Input = Text_Mensajes.Text
End Sub

En VB 6 pesco mucho. jejejejejeje. Quiero decir que no me entero. Me falta poner una variable que almacene los datos de entrada, luego esa variable donde tiene los datos o mensajes almacenados, lo deposita en el Text_Mensajes.Text.

¿Cómo se hace en VB?

Saludos.
 
Hola:


Private Sub RS232_OnComm()
En VB 6 pesco mucho. jejejejejeje. Quiero decir que no me entero. Me falta poner una variable que almacene los datos de entrada, luego esa variable donde tiene los datos o mensajes almacenados, lo deposita en el Text_Mensajes.Text.

¿Cómo se hace en VB?

Saludos.


No te entiendo pero la recepcion se hace en el evento OnComm del componente serial



analogico dijo:
No te entiendo pero la recepcion se hace en el evento OnComm del componente serial

no lo he probado pero recortando ese codigo seria mas menos

Código:
 if RS232.CommEvent =comEvReceive then
   
            szData = RS232.Input

end if
 
Última edición:
Usa el evento OnComm del control MSComm32
Dentro de ese evento, en lo personal uso Un Select Case porque puedo filtrar eventos.
También puedes hacerlo directo dentro del evento OnComm sin usar la selección.
Por ejemplo: (Va escrito aquí al vuelo, espero no equivocarme.)
Código:
Private Sub MSComm1_OnComm()
    Dim Dato_Recibido As String
    
    Dato_Recibido = MSComm1.Input
    
    Text1.Text = Text1.Text & Dato_Recibido
End Sub
Digamos que el Evento OnComm viene siendo el servicio de interrupción por recepción RS-232.
Lógicamente aquí no se interrumpe nada.

En el TextBox donde vas a mostrar los datos, establece las siguientes propiedades:
Locked = True
MultiLine = True
ScrollBars 3 - Both

Y aquí viene el truco para que la recepción de datos funcione.
En el evento Form_Load o en la página de propiedades (Búfer) del control MSComm32 debes establecer en 1 la propiedad "RThreshold" :cool:
 
¡¡¡Por fiiiiiiiiiiiiiiiiiiiiiiiiinnn funciona!!!

fsdafasdfsad.png

Código:
Private Sub MSComm_Puerto_Serie_OnComm()
    Dim Dato_Recibido As String ' Variable para almacenar datos.
    Dato_Recibido = MSComm_Puerto_Serie.Input ' Los datos recibidos lo almacena en la variable.
    Text_Mensajes.Text = Text_Mensajes.Text & Dato_Recibido ' Los datos de la varible lo muestra en el Text.
End Sub
Pensé que me iba a pegar media vida como al principio. Antes de continuar a modelar el tutorial desde el principio, la parte de VB 6 claro. Quiero hacer como hice con los otros lenguajes y este no se hacerlo, es:

Si te fijas bien, al llegarle muchos mensajes se activa la barra vertical, pero no se ve los datos al macenados, tienes que tocar la barra vertical hacia abajo para ver lo que está entrando.

¿Cómo se pone en la posición abajo por cada actualización de datos?

Por si acaso, en VB .net les dejo el trozo de código que se hace así, para darles ideas de lo que me refiero.

PHP:
    ' Procesador los datos recibidos en el buffer y extraer tramas copletas.
    Private Sub Actualizar(ByVal s As Object, ByVal e As EventArgs)
        ' Asignar el valor de la trama textBox.
        RichTextBox_Mensajes.Text = Recibidos

        ' Selecciona la posición final para leer los mensajes entrantes.
        RichTextBox_Mensajes.SelectionStart = RichTextBox_Mensajes.Text.Length

        ' Mantiene el scroll en la entrada de cada mensaje.
        RichTextBox_Mensajes.ScrollToCaret()
    End Sub
Un saludo.
 
Si te fijas bien, al llegarle muchos mensajes se activa la barra vertical, pero no se ven los datos al macenados, tienes que tocar la barra vertical hacia abajo para ver lo que está entrando.

¿Cómo se pone en la posición abajo por cada actualización de datos?
Eso está en el fragmento de código que colocaste anteriormente sobre mi programa:
txtRX.SelStart = Len(txtRX.Text)

En tu caso sería así:
TextMensajes.SelStart = Len(TextMensajes.Text)

Esa parte colócala al final de las instrucciones de recepción.
 
se puede hacer usando el api y simular el boton de scroll

declara en un modulo
Código:
 Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

en elformulario
Código:
  Private Const EM_SCROLL = &HB5
 
Private Const SB_PAGEDOWN = 3
 
Private Const SB_PAGEUP = 2
 
Private Const SB_LINEUP = 0
 
Private Const SB_LINEDOWN = 1
 
Private Const SB_BOTTOM = 7
 
Private Const SB_TOP = 6


y cuando quieras ir al fin aqui puedes probar con los doevents si no se actualiza el texbox
o los quitas

Código:
DoEvents
    SendMessage Text_Mensajes.hWnd, EM_SCROLL, SB_BOTTOM, 0
 DoEvents

muy simple no:LOL:

lo saque de aca por que no lo recodaba bien
http://www.vbforfree.com/advanced-textbox-manipulation-in-visual-basic-and-vb-net-part-2/#more-1311

ahora lei
el post de arriba se ve mas simple
SelStart
 
Última edición:
Buenas:

Por fin me funciona todo completo, al menos eso creo. ejjejejejej. Me responde Arduino UNO como Arduino Micro que tengo.

Código completo por si acaso.
PHP:
Option Explicit

Private Sub Form_Load()
    Dim WMIObjectSet As Object ' Variables del evento load.
    Dim wmiobject As Object
    Dim nCom%   ' Buscamos el número del puerto:
    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

        ' Para seleccionar el primer puerto encontrado:
        ComboBoxCOM.ListIndex = 0
    End With
End Sub

Private Sub ComboBoxCOM_Click()
    ' Configurar MSComm
    With Me.ComboBoxCOM
        MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex)
    End With
    Debug.Print "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
    'MsgBox "Puerto seleccionado: COM" & MSComm_Puerto_Serie.CommPort
End Sub

' Si ya has seleccionado un puerto en el comboBox
' Si pulsas conectar abre el puerto y si no lo cierra.
Private Sub Command_CONECTAR_Click()
    If Not MSComm_Puerto_Serie.PortOpen Then
     MSComm_Puerto_Serie.CommPort = ComboBoxCOM.ItemData(ComboBoxCOM.ListIndex)
       MSComm_Puerto_Serie.PortOpen = True ' Abrir puerto serie.
       Command_CONECTAR.Caption = "DESCONECTAR" ' Mostrar texto en el botón.
       ComboBoxCOM.Enabled = False
       Command_Led_8_ON.Enabled = True ' Activar botón ON.
       Command_Led_8_OFF.Enabled = True ' Activar botón OFF.
    Else
       MSComm_Puerto_Serie.PortOpen = False ' Cerrar puerto serie.
       Command_CONECTAR.Caption = "CONECTAR" ' Mostrar texto en el botón.
       ComboBoxCOM.Enabled = True
       Command_Led_8_ON.Enabled = False ' Desactivar botón ON.
       Command_Led_8_OFF.Enabled = False ' Desactivar botón OFF.
    End If
End Sub

Private Sub Command_Led_8_OFF_Click()
' Envía este cadena de carácter por el puerto serie.
    MSComm_Puerto_Serie.Output = "Led_8_OFF"
End Sub

Private Sub Command_Led_8_ON_Click()
' Envía este cadena de carácter por el puerto serie.
    MSComm_Puerto_Serie.Output = "Led_8_ON"
End Sub


Private Sub MSComm_Puerto_Serie_OnComm()
    Dim Dato_Recibido As String ' Variable para almacenar datos.
    Dato_Recibido = MSComm_Puerto_Serie.Input ' Los datos recibidos lo almacena en la variable.
    Text_Mensajes.Text = Text_Mensajes.Text & Dato_Recibido ' Los datos de la varible lo muestra en el Text.
    Text_Mensajes.SelStart = Len(Text_Mensajes.Text) ' Mantiene el scroll en la entrada de cada mensaje.
End Sub

Les pondré como colaboradores en el tutorial los que los deseen. Algunos ya los tengo puestos.

Saludos.
 
Hola:

Antes que nada, muchísimas gracias a todos.

Les dejo una demostración 2 del tutorial sobre VB 6 para los novatos, me inlcuyo, ejejjejeje :D. Se ha ehcho posible gracias a la colaboración o si no no hubiera sido posible. :apreton:.

Este pequeño PDF de VB es temporal, así que aprovechen para que le den un vistazo y opinen como va el tutorial en general y si realmente aporta ayuda para sus proyectos. Mucho más adelante, cuando todo esté acabado, seguiré con el tutorial principal de muchos lenguajes como C#, VB .net C++, Java y VB 6. Si quieren un ejemplo de esto que digo, lo piden y se los paso por privado.

Descargar

Un cordial saldudo.

PD: Ahora me toca con la electrónica y programación de Arduino..
 
Atrás
Arriba