Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: Meta 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.
(http://www.subeimagenes.com/img/re-1263176.png)
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.
-
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
-
hola meta : aver a lo mejor es algo muy absurdo pero bueno
aquiMSComm1.CommPort = ComboBoxCOM.ListIndex = 1no seria asi
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
mscommq.commport = ComboBoxCOM.ListIndex
tal vez sea algo tonto pero bueno
saludos
-
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.
(http://www.subeimagenes.com/img/meta-1264882.jpg)
Saludos, desde algún lugar de Lima-Perú
-
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.
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é. ;)
-
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.
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.
-
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.
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
-
Hola:
Parece ser que me funciona como una puncha. ;)
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.
-
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.
-
Me olvidé de ponerlo, ejjeje.
Si pincho dos veces con el ratón el comoBox me sale esto.
Private Sub ComboBoxCOM_Change()
End Sub
No se si este es el que dices.
Ahora, ¿qué código hay que poner dentro?