Paso 3: Visual Basic 6.0 (parte 2)
Después de las clases básicas, codifiqué la función de analizador para limitar la entrada del usuario y comunicaría con la función que envía datos al Arduino. Usé el analizador para que pudiera cargar comandos de otras fuentes y puedo cambiar la secuencia del programa en cualquier momento simplemente cambiando el archivo de texto. Esta técnica es muy útil en el largo plazo. Parpadeo de secuencias no necesita recodificada en VB para cambiar el patrón de la pantalla. Mi código del analizador se muestra a continuación:Código del programa
Privado Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds como largo) ' utilizar sleep(xxxx)
Private lSide As String, rSide As String
Privada archivo As String, sección As String, Comm como MsComm, txtFeedback como la caja de texto, cuadro de como texto txtStatus
Público Sub Init_Parser(FileName As String, FileSection As String, CommPort As Variant, txtBoxFeedback As Variant, statusBox As Variant)
Archivo = archivo
Sección = FileSection
Establecer Comm = CommPort
Set txtFeedback = txtBoxFeedback
Set cuadro txtStatus = statusBox
End Sub
Público Sub StringSort(ByVal item As String)
Si Len(item) > = 20 Then ' limitación al azar para comprobar si el comando es incorrecto
Registro de "código de Error de archivo: demasiado largo"
Salida Sub
End If ' limitar la longitud de cadenas para comprobar archivo de error
Item = Trim(item)
Si InStr (elemento, "") = 0 Then ' si no hay espacio en el código
lSide = artículo: rSide = vbNullString
Otra cosa
lSide = Left (artículo, InStr (elemento, "") - 1)
rSide = derecho (elemento, Len(item) - InStr (elemento, ""))
End If
Comandante
End Sub
Público Sub Commander()
Dim fCommand As String
On Error GoTo Error
fCommand = Left (lSide, 2)
Seleccione caso fCommand ' Biblioteca de
Caso «CO»
txtStatus.Text = "Conexión de la luz..." & vbCrLf & txtStatus.Text
Light.InitLightController archivo, sección, Comm, txtFeedback
Caso "CT"
txtStatus.Text = "Desconectando la luz..." & vbCrLf & txtStatus.Text
Light.ExitLight
Caso "LH"
txtStatus.Text = "Configuración activa luces..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Caso "LI"
txtStatus.Text = "Configuración de luz de intensidad..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Caso "LO"
txtStatus.Text = "Configuración de las luces..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Caso "RE"
txtStatus.Text = "Luces restablecer..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Caso "DE"
txtStatus.Text = "Demora en proceso..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Caso más
GoTo Error
Final seleccione
txtStatus.Text = lSide & "" & rSide & ": ejecutado..." & vbCrLf & txtStatus.Text
Salida Sub
Error:
Registro de "archivo de código de Error: sintaxis" & lSide & "" & rSide & "No válido"
Clave = 1
End Sub
'***************************************************************************************
' pop-up cuadro de mensaje Mostrar mensaje de error
'***************************************************************************************
Registro público Sub (como cadena de texto)
On Error GoTo Error
MsgBox texto & Err.Description
Salida Sub
Error:
MsgBox "Error al registro:" & Err.Description + vbCritical
Reanudar la siguiente
End Sub
_______________________________________________________________________________________________________
El tipo de datos variante se utiliza en lugar de MSComm o cuadro de texto porque estas características no podrían pasar en un archivo dll. La manera correcta de hacerlo es declarar como un tipo variante y después fijar el nombre de variable como un objeto privado después. Otra función permite la comunicación directa de VB6 y Arduino es la clase de "función de la luz". Cuando los datos se envían a la Arduino, el programa esperará un eco de Arduino. Esta técnica se utiliza como una adaptación del protocolo del apretón de manos simple en la comunicación serial entre la computadora portátil y el Arduino. Si no se detecta un eco, el contador de tiempo de espera de fuego y saltara un cuadro de mensaje alerta al usuario sobre el problema.
Código del programa
Orden privado como cadena, longitudTexto siempre, espera siempre
File_Name privado como cadena, File_Section como cadena
MComm privado como MsComm, Box como cuadro de texto
Privado Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds como largo)
Private Declare la función GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (lpApplicationName ByVal As String, ByVal lpKeyName como cualquiera, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize como largo, ByVal lpFileName As String) como larga
Público Sub InitLightController(PortSettingFileName As String, FileSection As String, MsComm As Variant, txtFeedback As Variant)
File_Name = PortSettingFileName
File_Section = FileSection
Establecer MComm = MsComm
Set Box = txtFeedback
Tiempo de espera = 200000
' Cargado de salida ajustes de COMPORT
Registro de "archivo:" & nombre_archivo & vbCrLf & "sección:" & File_Section
' Abrir puerto y conectar con Arduino
Con MComm
Si es. PortOpen entonces. PortOpen = False ' cerrar y ajustar el número de puerto com
. CommPort = SimpleGet("comport")
. Ajustes = SimpleGet("settings")
. EOFEnable = True
Registro de "Puerto Com:" &. CommPort & vbCrLf & "configuración:" &. Configuración
Terminar con
SendData ("CO")
End Sub
Público Sub SendData (ByVal Commandx como cadena)
On Error GoTo Error
Comando = Commandx
' fíjese primero en comando
Comando = Trim(Command) ' deshacerse de espacios adicionales en el lado
Si (InStr (comando, "") <> 0) o (Len(Command) > 10) entonces ' comando no debe tener más de 10 char o contener espacios
GoTo Error ' no enviar si el formato del comando es incorrecta
End If
Dim yo como Integer, Char, String
Para i = 1 a 2 ' porque longitud de carácter ecpected es sólo 2
Char = Mid (comando, i, 1)
Si (Char > = "A" y Char < = "Z") entonces ' no hacer nada si los 2 primeros caracteres son alfabetos
Otra cosa
GoTo Error
End If
Siguiente
' saltar automáticamente los comandos sin enteros CO, CT, RE
Para i = 3 a Len(Command) ' Asegúrese de que el resto del comando son números enteros
Char = Mid (comando, i, 1)
Si (Char > = "0" y Char < = "9") entonces ' no hacer nada si los caracteres restantes son números
Otra cosa
GoTo Error
End If
Siguiente
LongitudTexto = Len(Command) ' set longitudTexto esperada eco
Con MComm
. DTREnable = False
. = False ' desactivar la petición para enviar una señal
Si es. PortOpen = False Then. PortOpen = True ' abrir el puerto
. Salida = Commandx ' enviar texto
. RThreshold = longitudTexto ' guardar envía la longitud de cadena
Final con ' puerto para dejar abiertas esperar señal de eco proceder
OnComm ' espere respuesta de eco de Arduino
Salida Sub
Error:
Si (Err.Description) entonces
MsgBox Err.Description
Otra cosa
MsgBox "Comando no válido!"
End If
End Sub
Private Sub Log(Text As String)
En Error GoTo error
tBox.Text = texto & vbCrLf & tBox.Text
Salida Sub
ERROR:
MsgBox "Error al registro:" & Err.Description
Reanudar la siguiente
End Sub
' Función de OnComm manual para detectar eco de datos enviados
Private Sub OnComm()
Dim InString cadena, contar como tiempo
Hacer
DoEvents
Sueño (1)
Si Conde > tiempo de espera entonces
MsgBox "Tiempo alcanzado!" & vbCrLf & "No hay respuesta de Arduino!"
Salida Sub
End If
Loop hasta que MComm.CommEvent = comEvReceive MComm.InBufferCount y > = longitudTexto
Sueño (5)
' Recuperar todos los datos disponibles.
MComm.InputLen = 0
' Comprobar datos.
Si MComm.InBufferCount > 0 entonces ' leer los datos.
InString = MComm.Input
' verifica si los datos recibidos es el esperado
Si InStr (InString, comando) > 0 entonces ' si el comando es un eco
Otra cosa
GoTo Error
End If
Si Len(InString) > 0 entonces ' eco de salida en el cuadro de texto
tBox.Text = InString & tBox.Text
End If
End If
Si MComm.PortOpen entonces MComm.PortOpen = False ' cierra el puerto después de recibir respuesta
Salida Sub
Error:
Si (Err.Description) entonces
MsgBox Err.Description
Otra cosa
MsgBox "Recibiendo la función Error!"
End If
End Sub
Público Sub ExitLight()
SendData ("RE")
SendData ("CT")
Si MComm.PortOpen entonces MComm.PortOpen = False ' si el puerto está abierto, cierre si antes de la salida
End Sub
Función pública SimpleGet (VarName como cadena) como cadena
Static sLocalBuffer As String * 500
Dim l como entero de
l = GetPrivateProfileString (File_Section, VarName, vbNullString, sLocalBuffer, 500, nombre_archivo)
SimpleGet = Left$ (sLocalBuffer, l)
End Function