Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

07/04/2015 #41

Avatar de Meta

Hola:

¿Puedes poner el código completo con ese trozo de código?

Saludos.
07/04/2015 #42


D@rkbytes dijo: Ver Mensaje
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: Archivo Adjunto 127756

Pero del puerto COM2 en adelante, ya no es el número de puerto correcto: 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
 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
y

s
D@rkbytes dijo: Ver Mensaje
Usa esta función para obtener el número del puerto eleccionado en el ComboBox:
Código:
Private Function Get_CommPort(ComboPuertos As ComboBox) As Integer
    ' Obtener y retornar únicamente el número del puerto seleccionado.
    Dim StrPos%
    Dim Cadena$
    StrPos = InStr(1, ComboPuertos.Text, "(")
    
    If StrPos Then
        Cadena = CStr(Mid(ComboPuertos.Text, StrPos, 6))
        Get_CommPort = CStr(Val(Mid(Cadena, 5, 2)))
    Else
        Get_CommPort = 0
    End If
End Function
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
07/04/2015 #43
Moderador

Avatar de D@rkbytes

Meta dijo: Ver Mensaje
¿Puedes poner el código completo con ese trozo de código?
Claro, pero para que lo entiendas mejor, adjunto un ejemplo.

analogico dijo: Ver Mensaje
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.
analogico dijo: Ver Mensaje
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.
analogico dijo: Ver Mensaje
Usando matrices sale más fácil.
No es que sea más fácil así, es sólo otra forma de hacerlo.

Saludos.
Archivos Adjuntos
Tipo de Archivo: rar Ejemplo ComboBox para MSCOMM.rar (2,6 KB (Kilobytes), 6 visitas)
08/04/2015 #44

Avatar de Meta

Buenas:

Me estoy liando...

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.

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.


Me señala aquí siempre.


¿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..
Imágenes Adjuntas
Tipo de Archivo: jpg LOCO.jpg (50,9 KB (Kilobytes), 42 visitas)
Tipo de Archivo: jpg dsf.jpg (18,4 KB (Kilobytes), 41 visitas)
Tipo de Archivo: png fsdafasdfsad.png (40,8 KB (Kilobytes), 42 visitas)
Archivos Adjuntos
Tipo de Archivo: rar InterDuinoVB6.rar (8,0 KB (Kilobytes), 5 visitas)
08/04/2015 #45


Meta dijo: Ver Mensaje
Buenas:

Me estoy liando...

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.
http://www.forosdeelectronica.com/at...1&d=1428493124
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.
http://www.forosdeelectronica.com/at...1&d=1428493301

Me señala aquí siempre.
http://www.forosdeelectronica.com/at...1&d=1428493420

¿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=""
08/04/2015 #46

Avatar de Meta

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.



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.
08/04/2015 #47


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
08/04/2015 #48

Avatar de Meta

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.
08/04/2015 #49


Meta dijo: Ver Mensaje


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

Espero que no sea tan complicado como todo esto.

Saludos.
pues si

y no es complicado
solo lo hiciste del modo difici
08/04/2015 #50

Avatar de Meta

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.
10/04/2015 #51

Avatar de Meta

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.
10/04/2015 #52


Meta dijo: Ver Mensaje
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

---------- Actualizado después de 8 minutos ----------

analogico dijo: Ver Mensaje
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
10/04/2015 #53
Moderador

Avatar de D@rkbytes

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"
10/04/2015 #54

Avatar de Meta

¡¡¡Por fiiiiiiiiiiiiiiiiiiiiiiiiinnn funciona!!!



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.

Código 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.
Imágenes Adjuntas
Tipo de Archivo: png fsdafasdfsad.png (5,6 KB (Kilobytes), 29 visitas)
10/04/2015 #55
Moderador

Avatar de D@rkbytes

Meta dijo: Ver Mensaje
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.
10/04/2015 #56


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

lo saque de aca por que no lo recodaba bien
http://www.vbforfree.com/advanced-te...t-2/#more-1311

ahora lei
el post de arriba se ve mas simple
SelStart
10/04/2015 #57

Avatar de Meta

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.
Código 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.NamenCom 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.
11/04/2015 #58

Avatar de Meta

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 . Se ha ehcho posible gracias a la colaboración o si no no hubiera sido posible. .

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..
11/04/2015 #59


para que es el timer de la pagina 18?
11/04/2015 #60

Avatar de Meta

En este caso, de adorno. Xdddddddddddd. Debo corregir esta parte, como no combrarlo.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.