Muy Buenas a todos y todas!!!
Después de actualizar a la versión 1.1 del programa CDLA, ahora le toca el turno al programa en Visual Basic 6 para controlar las locomotoras desde el PC.
Este programa ya transmitía datos desde el PC al PIC, ahora lo que quiero que haga es que lea el control manual y muestre en la pantalla del ordenador los datos que envía el microcontrolador.
Para esto he utilizado el objeto MSCOMM1 que ya trae Visual Basic 6 con la instrucción "MScomm1.input".
Intentare explicarlo un poco y espero que sea comprensible:
Enviando datos desde PIC a VB6
Los datos que se mandan desde el microcontrolador PIC son transmitidos a una velocidad de 9600 bauds y cada variable va separada por ",":
include "modedefs.bas" 'Activa el modo de comunicación
Masterout var portc.6
Serout portb.1, N9600, [#variable1,#variable2,#variable3,"AK"]
* La variable 1 es una variable tipo BYTE que va desde 0 a 255
* La variable 2 es una variable tipo BYTE que va desde 1 a 8
* La variable 3 es una variable tipo BIT que va desde 0 a 1
Con serialComunicator de Mecanique nos mostrará en pantalla los datos en el siguiente formato:
010AK 010AK 010AK.... (Variable1 = 0, Variable2 =1, Variable3 =0, AK)
12831AK 12831AK 12831AK... (Variable1 = 128, Variable2 =,3 Variable3 =1, AK)
Esta es la trama de datos que se envían desde el microcontrolador PIC y que tendremos que decodificar en VB6.
Obtención de datos en VB6
Ahora, ¿como extraemos de esa maraña de caracteres los datos que nos interesan?
Para obtener los datos tenemos la función .Input de MScomm. con el adquirimos los datos del cual luego iremos desgranando dato por dato.
La rutina que vamos a utilizar esta dentro de un timer como podemos ver en el siguiente ejemplo:
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim dataIn, tdataIn, Vel, total As String
Dim C, T, N, X As Integer 'cantidad, tipo, numero, valor
Private Sub Command1_Click()
Timer1.Enabled = True
MSComm1.PortOpen = True
Command1.Enabled = False
Command2.Enabled = True
End Sub
Private Sub Command2_Click()
Command1.Enabled = True
Command2.Enabled = False
Timer1.Enabled = False
MSComm1.PortOpen = False
End Sub
Private Sub Form_Load()
Timer1.Enabled = False
Command1.Enabled = True
Command2.Enabled = False
End Sub
Private Sub Timer1_Timer()
dataIn = MSComm1.Input
If dataIn <> "" Then ' Si no es un texto vacio entonces...
tdataIn = Len(dataIn)
If tdataIn = 7 And Right(dataIn, 2) = "AK" Then
Text2.Text = (Right(dataIn, 2))
Text1.Text = dataIn
Vel = Mid$(dataIn, 1, 3)
total = ""
For X = 1 To Len(Vel)
If InStr("0123456789", Mid$(Vel, X, 1)) Then
total = total & Mid(Vel, X, 1)
N = total
End If
Next X
dataIn = (Right(dataIn, 4))
C = Left(dataIn, 1)
dataIn = Right(dataIn, 3)
T = Left(dataIn, 1)
Text3.Text = C
Text4.Text = T
Text5.Text = N
End If
End If
End Sub
- Text1: Lectura de toda la trama de datos enviados por el PIC.
- Text2: Lectura de los caracteres de confirmación (AK).
- Text3: Lectura de la Variable2
- Text4: Lectura de la Variable3
- Text5: Lectura de la Variable1
El tema de como sacar el los números de una cadena, viene muy bien explicado y con varios ejemplos en este magnifico foro de Visual Basic.
Espero que les sea de ayuda para entender como comunicar un microcontrolador PIC 16F628 o 16F876A con un sistema Visual Basic 6
Saludos a todos y todas!!!
Hola amigo esta súper tu explicación y me a orientado mucho, te cuento que yo intento separar 3 variables que mando desde el PIC estas son de 8 Bits 0-255 pero cuando cambian su valor y dejan de ser 3 digitos todo se revuelve en los textBox me podrías orientar un poco sobre que puedo hacer ?
ResponderEliminar