Autor Tema: Intentar hacer este reto con VB 6 que no me sale.  (Leído 2343 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Meta

  • Bit
  • Mensajes: 4
  • Reputación: +0/-0
    • Ver Perfil
Intentar hacer este reto con VB 6 que no me sale.
« en: Marzo 28, 2015, 06:30:17 am »
Hola a todos y a todas:

Estoy intentando hacer un buen diseño básico con VB 6 bajo Windows 7 de 64 bits.



1) Se trata de una interfaz que con un botón llamado CONECTAR conecte a un puerto serie que haya en disposición en el comboBox.

2) En el comboBox se añade automáticamente los puertos series físicos y virtuales detectados al ejecutar la aplicación o interfaz o tu programa de VB 6.

3) Eliges en el comboBox el puerto serie detectado y pulsas el botón CONECTAR. Si hay un puerto seleccionado en el botón se cambia la palabra a DESCONECAR para desconectar el puerto serie. Si no detecta el puerto serie en el comobox, en el comobox se queda en blanco y el botón CONECTAR desactivado. Solo se activa si detecta algún puerto serie en el comobox.

4) Los botones de ON y OFF es para enviar tramas o string por el puerto serie.
Si pulsas ON exactamente por el puerto envías esto:

Led_8_ON

Lo mismo para el botón OFF, que envías estas tramas de bytes o string.

Led_8_OFF

5) Desde el otro lado del puerto serie tiene que recibir mensajes y mostrarlo en el cuadro Text con multiline activado tal como muestra en la imagen de arriba. Arduino o un PIC e incluso un PC les llega estos mensajes.

Los mensajes que llega depende lo que se haya programado en Arduino o un PIC o un PC. Por ejemplo, si pulso el botón ON de VB 6. Envía al puerto serie Led_8_ON, ARduino lo detecta y le devuelve un mensaje o cadena de carácteres que dice:

Led 8 encendido.

He intentado que me salga pero no me sale mucho. Necesito ayuda en la programación, ya que no se parece nada al VB .net y para equipos viejos que usa Windows XP de 32 bits me va de maravilla.

Un cordial saludos.

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:Intentar hacer este reto con VB 6 que no me sale.
« Respuesta #1 en: Marzo 28, 2015, 07:57:16 pm »
Tenes que leer la respuesta de tu sistema embebido? Si la respuesta es NO, o bien la respuesta es bastante "lenta" (es decir, no tenes un stream de datos a alta velocidad), podes usar mi clase clsCOM (http://leandroascierto.com/foro/index.php?topic=345)
Es mas sencilla de usar que el OCX del MSCOMM y basicamente no precisas una referencia adicional (al mscomm.ocx, la cual deberias instalar y registrar con tu aplicacion en donde la instales).

Saludos
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

aedEric

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +20/-0
    • Ver Perfil
Re:Intentar hacer este reto con VB 6 que no me sale.
« Respuesta #2 en: Marzo 29, 2015, 09:12:30 pm »
hola meta : aver a lo mejor es algo muy absurdo pero bueno

aqui
Código: [Seleccionar]
MSComm1.CommPort = ComboBoxCOM.ListIndex = 1no seria asi
Código: [Seleccionar]
me.ComboBoxCOM.ListIndex=1
MSComm1.CommPort= me.comboboxcom.text

ya que por lo que pretendo entender quieres que te tome el valor del text del combo del index 1  por que si quiesieras que te tomara el valor del index solo tendrias que hacer esto
Código: [Seleccionar]
mscommq.commport = ComboBoxCOM.ListIndex
tal vez sea algo tonto pero bueno

saludos
« última modificación: Marzo 29, 2015, 09:17:19 pm por aedEric »
No he fracasado. He encontrado 10000 soluciones que no funcionan.

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Intentar hacer este reto con VB 6 que no me sale.
« Respuesta #3 en: Marzo 30, 2015, 01:02:29 am »
Estimado Meta
Ya que nos la haces difícil al no publicar el código, te pongo de igual forma el código de ejemplo.
Bueno, echa esa aclaración paso a indicarte lo que me parece que estás haciendo mal:
En el evento Form_Load estas asignado erradamente el valor del puerto al parametro CommPort del objeto MSComm1, ya que al hacer esto MSComm1.CommPort = ComboBoxCOm.ListIndex = 0 le estas asignado un valor de True o False. En el parámetro CommPort del MSComm1 corresponde al valor del puerto y este es un valor numérico.
Al no poder ver tu código completo me parece que erradamente estas poblando el ComboBox, ya que solo usas el método AddItem, con ello solo está cargando el nombre del puerto (wmiobj.Name), más no el número del puerto que le corresponde. Debes de tener en consideración que el ComboBox cumple dos funciones una es mostrar una lista contexto amigable a los usuarios “personas” y la otra es retornar una valor numérico o de texto, que es lo que el código espera recibir como resultado de la selección de la usuario.
En la imagen observaras que he adicionado esta línea ComboBoxCOM.ItemData(ComboBoxCOM.NewIndex) = wmiobj.NameID, con ella estoy asignado al ComboBox al paremetro CommPort el valor del puerto que le corresponde al nombre del puerto que has adicionado con AddItem
También te muestro el código que corresponde al botón Conectar, ahí puedes ver cómo le asigno al CommPort el valor númerico. El Timer no se para que lo estas usas.

Saludos, desde algún lugar de Lima-Perú
Saludos, desde algún lugar de Lima-Perú

Meta

  • Bit
  • Mensajes: 4
  • Reputación: +0/-0
    • Ver Perfil
Re:Intentar hacer este reto con VB 6 que no me sale.
« Respuesta #4 en: Marzo 30, 2015, 03:24:54 am »
Hola:

Antes de pulsar CONECTAR, hay que elegir en el comboBox el puerto. Al ejecutar la aplicación, automáticamente se añade los puertos serie físicos y virtuales encontrados. Selecciona el que quieras y pulsas el botón CONECTAR. Si no encuentra ningún puerto, en el comobox aparece en blanco y si pulsas CONECTAR, te dirá un mensaje que no hay puerto y no se podrá conectar.

Es lo que quiero hacer de momento, cuando esto me funcione, me meteré con recibir mensajes y ponerlo en el Text.

Código completo que he hecho hasa ahora es este de aquí abajo.
Código: [Seleccionar]
    Private Sub Form_Load()
       'Form1.ComboBoxCOM.Clear ' Limpiar comboBox.
          MSComm1.CommPort = ComboBoxCOM.ListIndex
         
    Timer1.Interval = 1       ' Correr el timer a 1 mls.
       Set WMIObjectSet = GetObject("winmgmts:\\.\root\CIMV2").ExecQuery("SELECT * FROM Win32_PnPEntity") 'Win32_SerialPort")
       For Each wmiobject In WMIObjectSet
           If InStr(wmiobject.Name, "COM") Then   '
             Form1.ComboBoxCOM.AddItem wmiobject.Name
           End If
            Next
       Set WMIObjectSet = Nothing
    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 MSComm1.PortOpen Then
       MSComm1.PortOpen = True ' Abrir puerto serie.
       Command_CONECTAR.Caption = "DESCONECTAR"
    Else
       MSComm1.PortOpen = False ' Cerrar puerto serie.
       Command_CONECTAR.Caption = "CONECTAR"
    End If
End Sub

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

Muchas gracias a todos y disculpen de no poner el código completo, me despisté. ;)

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Intentar hacer este reto con VB 6 que no me sale.
« Respuesta #5 en: Marzo 30, 2015, 09:03:47 pm »
Hola, la propiedad CommPort acepta solo puertos validos.

Si queres conectarte al puerto que esta seleccionado en el combobox, simplemente toma solo la parte que dice "COM4" la otra parte del texto es invalida, no se te va a conectar nunca.

la propiedad solo toma puertos "COM1", "COM2"..etc...si vos le pones "Arduino (COM4)" no te va a funcionar.

El problema aca es que vos estas mostrando en el combobox la descripcion del puerto, pero el mscomm necesita solo el numero del puerto, no la descripcion.

entonces tenes 2 opciones:

1 - extraes del texto la parte que dice "COM4", sacando el texto que esta entre parentesis (no lo recomiendo ya que puede venir algun texto que haga que esto no funcione).

2 - cuando llenas el combo usar un array para almacenar solo el nombre del puerto, sin la descripcion.

aca te dejo un simple ejemplo de como llenar un combobox con texto  el nombre del puerto y luego al hacer clic en algun item, te muestra solo el nombre del puerto, sin la descripcion, que es lo que necesitas para conectarte al mscomm.

Código: (vb) [Seleccionar]
Option Explicit

Dim vPuertos() As String 'Para almacenar el verdadero nombre de los puertos, sin la descripocion.

Private Sub Form_Load()
    Dim i As Integer
    For i = 1 To 10
        Combo1.AddItem "Arduino (COM" & i & ")" ' cargo el combo con descripcion y el numero del puerto
       
        ReDim Preserve vPuertos(Combo1.ListCount - 1)
        vPuertos(Combo1.ListCount - 1) = "COM" & i
    Next
End Sub

Private Sub Combo1_Click()
    MsgBox vPuertos(Combo1.ListIndex) '  te muestra solo el nombre real del puerto, sin la descripcion
End Sub

saludos.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Intentar hacer este reto con VB 6 que no me sale.
« Respuesta #6 en: Marzo 30, 2015, 09:56:57 pm »
Una consulta.
Tomando un poco de lo que dice Albertomi y otro poco de lo que dice seba123neo, ¿se podría hacer de la manera que describo a continuación?
Asignar en el ItemData de cada elemento del combobox el número de puerto (solo el valor numérico) y, al seleccionar dicho elemento, asignar el puerto añadiendo el texto "COM" y el valor contenido en el ItemData.
Código: (VB) [Seleccionar]
Option Explicit
 
Private Sub Form_Load()
    Dim i As Integer
    For i = 1 To 10
        Combo1.AddItem "Arduino (COM" & i & ")" ' cargo el combo con descripcion y el numero del puerto
        Combo1.ItemData(Combo1.NewIndex) = i
    Next
End Sub
 
Private Sub Combo1_Click()
    MsgBox "COM" & Combo1.ItemData(Combo1.ListIndex) '  te muestra solo el nombre real del puerto, sin la descripcion
End Sub
¿Es válido así?
Muchas gracias.

Jerónimo

Meta

  • Bit
  • Mensajes: 4
  • Reputación: +0/-0
    • Ver Perfil
Re:Intentar hacer este reto con VB 6 que no me sale.
« Respuesta #7 en: Marzo 31, 2015, 04:26:23 am »
Hola:

Parece ser que me funciona como una puncha. ;)

Código: [Seleccionar]
    Option Explicit
     
    Dim vPuertos() As String 'Para almacenar el verdadero nombre de los puertos, sin la descripocion.
     
    Private Sub Form_Load()
        Dim i As Integer
        For i = 1 To 10
            ComboBoxCOM.AddItem "Arduino (COM" & i & ")" ' cargo el combo con descripcion y el numero del puerto
           
            ReDim Preserve vPuertos(ComboBoxCOM.ListCount - 1)
            vPuertos(ComboBoxCOM.ListCount - 1) = "COM" & i
        Next
    End Sub
     
    Private Sub ComboBoxCOM_Click()
        MsgBox vPuertos(ComboBoxCOM.ListIndex) '  te muestra solo el nombre real del puerto, sin la descripcion
    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 MSComm1.PortOpen Then
       MSComm1.PortOpen = True ' Abrir puerto serie.
       Command_CONECTAR.Caption = "DESCONECTAR"
    Else
       MSComm1.PortOpen = False ' Cerrar puerto serie.
       Command_CONECTAR.Caption = "CONECTAR"
    End If
End Sub

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

Me he dado cuante, elija cualquier puerto o no en el ComboBox, puedo controlar de igualmente Arduino. Algo no anda bien.

Hay que buscar el fallo.

Si elijo el peurto COM1 que no tengo nada conectado, está bien que abra el puerto, pero que no controle el Arduino, lo mismo para los demás puertos.

Saludos.

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Intentar hacer este reto con VB 6 que no me sale.
« Respuesta #8 en: Abril 02, 2015, 04:38:26 pm »
El ItemData solo acepta numeros integer, podes guardar ahi el numero del puerto y adelante concatenarle de forma fija el string "COM".

me parece raro, ¿ ese es todo el codigo que hay ?  fijate si el control MSComm1 no tiene en las propiedades asignado algun puerto por defecto, se tiene que estar conectando en algun lado.


Meta

  • Bit
  • Mensajes: 4
  • Reputación: +0/-0
    • Ver Perfil
Re:Intentar hacer este reto con VB 6 que no me sale.
« Respuesta #9 en: Abril 03, 2015, 11:20:07 am »
Me olvidé de ponerlo, ejjeje.

Si pincho dos veces con el ratón el comoBox me sale esto.

Código: [Seleccionar]
Private Sub ComboBoxCOM_Change()

End Sub

No se si este es el que dices.

Ahora, ¿qué código hay que poner dentro?