Stap 3: Visual Basic 6.0 (deel 2)
Na de fundamentele klassen, ik gecodeerd de parser-functie om te beperken van de invoer van de gebruiker en het zou communiceren met de functie die gegevens naar de Arduino stuurt. Ik gebruikte parser, zodat ik opdrachten uit andere bronnen laden kan en ik de volgorde van het programma op elk gewenst moment veranderen kan gewoon door het veranderen van het tekstbestand. Deze techniek is zeer nuttig op de lange termijn. Knipperen van sequenties moet niet worden gehercodeerd in VB naar het patroon van de weergave wijzigen. Mijn parser code wordt hieronder weergegeven:Programma-Code
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) ' te gebruiken sleep(xxxx)
Privé lSide As String, rSide As String
Privé bestand als tekenreeks, sectie As String, Comm als MsComm, txtFeedback als TextBox, txtStatus als TextBox
Public Sub Init_Parser(FileName As String, FileSection As String, CommPort As Variant, txtBoxFeedback As Variant, statusBox As Variant)
File = Bestandsnaam
Sectie = FileSection
Instellen van Comm = CommPort
Set txtFeedback = txtBoxFeedback
Set txtStatus = statusBox
End Sub
Public Sub StringSort(ByVal item As String)
Als Len(item) > = 20 Then ' willekeurige beperking om te controleren als er sprake is van een verkeerde opdracht
Log "bestand codefout: te lang"
Exit Sub
End If ' beperken de lengte van de snaren te controleren voor foutbestand
item = Trim(item)
Als InStr (item, "") = 0 Then ' als er geen ruimte in code is
lSide = item: rSide = vbNullString
Anders
lSide = Left (punt, InStr (item, "") - 1)
rSide = rechts (object, Len(item) - InStr (item, ""))
End If
Commandant
End Sub
Public Sub Commander()
Dim fCommand As String
Op GoTo fout
fCommand = Left (lSide, 2)
Selecteer zaak fCommand ' bibliotheek
Geval "CO"
txtStatus.Text = "Het verbinden … van de licht" & vbCrLf & txtStatus.Text
Light.InitLightController bestand, sectie, Comm, txtFeedback
Koffer "CT"
txtStatus.Text = "Verbinding verbreken licht..." & vbCrLf & txtStatus.Text
Light.ExitLight
Geval "LH"
txtStatus.Text = "Instelling actieve lichten..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Geval "LI"
txtStatus.Text = "Instelling licht intensiteit..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Kast "LO"
txtStatus.Text = "Configureren lichten..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Geval "RE"
txtStatus.Text = "Lichten Reset..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Geval 'Nl'
txtStatus.Text = "Vertraging In proces..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Geval anders
GoTo fout
Einde selecteren
txtStatus.Text = lSide & "" & rSide & ": uitgevoerd..." & vbCrLf & txtStatus.Text
Exit Sub
Fout:
Log "bestand codefout: syntaxis" & lSide & "" & rSide & "Niet geldig"
Toets = 1
End Sub
'***************************************************************************************
' pop omhooggaand berichtvenster weer te geven fout
'***************************************************************************************
Public Sub Log (tekst als tekenreeks)
Op GoTo fout
MsgBox tekst & Err.Description
Exit Sub
Fout:
MsgBox "fout voordat ze zich aanmelden:" & Err.Description + vbCritical
Resume Next
End Sub
_______________________________________________________________________________________________________
Het gegevenstype Variant wordt gebruikt in plaats van MSComm of textbox, omdat deze eigenschappen kon niet worden doorgegeven in een dll-bestand. De juiste manier om het te doen is te declareren als het type Variant en stel vervolgens de naam van de variabele als een privé-object na. Een andere functie die ik gebruikt om rechtstreekse communicatie van VB6 en Arduino is de klasse "licht functie". Wanneer alle gegevens wordt verzonden naar de Arduino, zal het programma wachten op een echo van Arduino. Deze techniek wordt gebruikt als een aanpassing van eenvoudige handshaking-protocol in seriële communicatie tussen de laptop en de Arduino. Als een echo niet voelde is, zal de timeout-teller brand en pop uit een berichtvenster om de gebruiker over het probleem te waarschuwen.
Programma-Code
Privé opdracht als tekenreeks, TextLength zolang, time-out zo lang
Privé bestandsnaam As String, File_Section As String
Privé MComm als MsComm, tBox als TextBox
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Public Sub InitLightController(PortSettingFileName As String, FileSection As String, MsComm As Variant, txtFeedback As Variant)
File_Name = PortSettingFileName
File_Section = FileSection
MComm instellen = MsComm
Instellen van de tBox = txtFeedback
TimeOut = 200000
' Output geladen COMPOORT instellingen
Log "bestand:" & File_Name & vbCrLf & "sectie:" & File_Section
' Open COMpoort en sluit met Arduino
Met MComm
Als. PortOpen dan. PortOpen = False ' sluit en het nummer van de com-poort instellen
. CommPort = SimpleGet("comport")
. Instellingen = SimpleGet("settings")
. EOFEnable = True
Log "Com-poort:" &. CommPort & vbCrLf & "instellingen:" &. Instellingen
Eindigen met
SendData ("CO")
End Sub
Public Sub SendData (ByVal Commandx As String)
Op GoTo fout
Opdracht = Commandx
' eerst controleren, opdracht
Opdracht = Trim(Command) ' ontdoen van extra spaties aan de zijkant
Als (InStr (opdracht, "") <> 0) of (Len(Command) > 10) toen ' opdracht mag niet langer zijn dan 10 char of spaties bevatten
GoTo fout ' Stuur geen als opdracht indeling verkeerd is
End If
Dim i As Integer, Char zoals String
Voor i = 1 tot 2 ' omdat de lengte van ecpected teken is alleen 2
Char = Mid (Command, i, 1)
Als (Char > = "A" en Char < = "Z") dan ' niets doen als eerste 2 tekens alfabetten
Anders
GoTo fout
End If
Volgende ik
' automatisch overslaan voor opdrachten zonder gehele getallen CO, CT, RE
Voor i = 3 te Len(Command) ' zorg ervoor dat de rest van de opdracht zijn gehele getallen
Char = Mid (Command, i, 1)
Als (Char > = "0" en Char < = "9") dan ' niets doen als overige tekens cijfers zijn
Anders
GoTo fout
End If
Volgende ik
TextLength = Len(Command) ' Stel verwachte textlength echo
Met MComm
. DTREnable = False
. RTSEnable = False ' verzoek signaal uitschakelen
Als. PortOpen = False Then. PortOpen = True ' poort openen
. Uitvoer Commandx = ' Verstuur tekst
. RThreshold = TextLength ' Save verzonden tekenreekslengte
End With ' openlaten van de poort te wachten op de echo signaal om verder te gaan
OnComm ' wachten op antwoord van de echo van de Arduino
Exit Sub
Fout:
Als (Err.Description) dan
MsgBox Err.Description
Anders
MsgBox 'Invalid Command!'
End If
End Sub
Private Sub Log(Text As String)
Op fout GoTo ERRR
tBox.Text = tekst & vbCrLf & tBox.Text
Exit Sub
ERRR:
MsgBox "fout voordat ze zich aanmelden:" & Err.Description
Resume Next
End Sub
' Handmatige OnComm-functie voor het detecteren van echo van verzonden gegevens
Private Sub OnComm()
Dim InString As String, telling als lang
Doen
DoEvents
Slaap (1)
Als Count > TimeOut dan
MsgBox "Time Out Reached!!!" & vbCrLf & "No Reply van Arduino!"
Exit Sub
End If
Loop totdat MComm.CommEvent comEvReceive en MComm.InBufferCount = > = TextLength
Slaap (5)
' Alle beschikbare gegevens op te halen.
MComm.InputLen = 0
' Controleren of gegevens.
Als MComm.InBufferCount > 0 Then ' gegevens lezen.
InString = MComm.Input
' controleren of het ontvangen van gegevens is zoals verwacht.
Als InStr (InString, opdracht) > 0 Then ' als opdracht een echo is
Anders
GoTo fout
End If
Als Len(InString) > 0 Then ' Output echo op textbox
tBox.Text = InString & tBox.Text
End If
End If
Als MComm.PortOpen dan MComm.PortOpen = False ' poort sluiten na ontvangst van antwoord
Exit Sub
Fout:
Als (Err.Description) dan
MsgBox Err.Description
Anders
MsgBox "Fout van de functie ontvangen!"
End If
End Sub
Public Sub ExitLight()
SendData ("Ref")
SendData ("CT")
Als MComm.PortOpen dan MComm.PortOpen = False ' als poort geopend is, sluit als voor afslag
End Sub
Public Function SimpleGet (VarName As String) As String
Statische sLocalBuffer As String * 500
Dim l As Integer
l = GetPrivateProfileString (File_Section, VarName, vbNullString, sLocalBuffer, 500, bestandsnaam)
SimpleGet = links$ (sLocalBuffer, l)
End Function