Arduino & Visual Basic 6 (Light Controller) (3 / 4 steg)
Steg 3: Visual Basic 6.0 (del 2)
Efter de grundläggande klasserna, jag kodade parser funktion för att begränsa användarens inmatningar och den vill kommunicera med den funktion som skickar data till Arduino. Jag använde parser så att jag kunde ladda kommandon från andra källor och jag kan ändra sekvensen program när som helst bara genom att ändra text-filen. Denna teknik är mycket bra på lång sikt. Blinkar sekvenser behöver inte kodas i VB att ändra displayen mönster. Min parser koden visas nedan:Programkod
Privat deklarera Sub sova Lib "kernel32" (ByVal dwMilliseconds As Long) "att använda sleep(xxxx)
Privata lSide As String, rSide As String
Privat fil As String, avsnitt som sträng, Comm som MsComm, txtFeedback som lärobok, txtStatus som lärobok
Public Sub Init_Parser(FileName As String, FileSection As String, CommPort As Variant, txtBoxFeedback As Variant, statusBox As Variant)
Fil = filnamn
Avsnitt = FileSection
Ställa in Comm = CommPort
Ange txtFeedback = txtBoxFeedback
Ange txtStatus = statusBox
End Sub
Public Sub StringSort(ByVal item As String)
Om Len(item) > = 20 då "random begränsning att kontrollera om kommandot är fel
Log "fil koden misstag: för lång"
Exit Sub
Slut om "begränsa strängar längden till check för felfilen
item = Trim(item)
Om InStr (post, "") = 0 då "om det finns något utrymme i kod
lSide = objekt: rSide = vbNullString
Annat
lSide = vänster (posten, InStr (post, "") - 1)
rSide = höger (objekt, Len(item) - InStr (post, ""))
Slut om
Commander
End Sub
Public Sub Commander()
Dim fCommand As String
På fel GoTo fel
fCommand = vänster (lSide, 2)
Välj ärende fCommand ' bibliotek
Fallet "CO"
txtStatus.Text = "Ansluter ljus..." & vbCrLf & txtStatus.Text
Light.InitLightController fil, avsnitt, Comm, txtFeedback
Fallet "CT"
txtStatus.Text = "Koppla från ljus..." & vbCrLf & txtStatus.Text
Light.ExitLight
Fallet "LH"
txtStatus.Text = "Inställningen aktiv lampor..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Fallet "LI"
txtStatus.Text = "Inställningen ljus intensitet..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Fallet "LO"
txtStatus.Text = "Konfigurera lampor..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Fallet "RE"
txtStatus.Text = "Lampor återställa..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Fallet "DE"
txtStatus.Text = "Försening i processen..." & vbCrLf & txtStatus.Text
Light.SendData lSide
Fallet annat
Gå till fel
End Select
txtStatus.Text = lSide & "" & rSide & ": avrättades..." & vbCrLf & txtStatus.Text
Exit Sub
Fel:
Log "fil koden misstag: Syntax" & lSide & "" & rSide & "Giltigt"
Nyckel = 1
End Sub
'***************************************************************************************
"popup-meddelande om du vill visa fel
'***************************************************************************************
Offentliga Sub Log (Text som sträng)
På fel GoTo fel
MsgBox Text & Err.Description
Exit Sub
Fel:
MsgBox "ett fel uppstod när loggning:" & Err.Description + vbCritical
Återuppta nästa
End Sub
_______________________________________________________________________________________________________
Variant-datatyp används i stället för MSComm eller lärobok eftersom dessa egenskaper inte kunde överföras i en DLL-fil. Rätt sätt att göra det är att deklarera som typen Variant och sedan ange variabelnamnet som ett privat objekt efter. En annan funktion jag används för att tillåta direkt kommunikation av VB6 och Arduino är klassen "ljus funktion". När data skickas till Arduino, väntar programmet på ett eko från Arduino. Denna teknik används som en anpassning av enkla handskakning protokoll i seriell kommunikation mellan den bärbara datorn och Arduino. Om ett eko inte är kände, kommer räknaren timeout eld och popmusik ute en meddelanderuta att uppmärksamma användaren om problemet.
Programkod
Privata kommando som sträng, TextLength så länge, TimeOut så länge
Privata filnamn som sträng, File_Section som sträng
Privat civilingenjörsexamen som MsComm, tBox som lärobok
Privat deklarera Sub sova Lib "kernel32" (ByVal dwMilliseconds As Long)
Privata Declare funktionen GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName som någon, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nStorlek som lång, ByVal lpFileName As String) som lång
Public Sub InitLightController(PortSettingFileName As String, FileSection As String, MsComm As Variant, txtFeedback As Variant)
Filnamn = PortSettingFileName
File_Section = FileSection
Ställa in civilingenjörsexamen = MsComm
Ställa in tBox = txtFeedback
TimeOut = 200000
"Output laddade COMPORT inställningar
Log "File:" & filnamn & vbCrLf & "avsnitt:" & File_Section
"Öppna ComPort och Anslut med Arduino
Med Civilingenjörsexamen
Om. PortOpen då. PortOpen = False ' Stäng och ställa in com-portens nummer
. CommPort = SimpleGet("comport")
. Inställningar = SimpleGet("settings")
. EOFEnable = sant
Log "Com-Port:" &. CommPort & vbCrLf & "inställningar:" &. Inställningar
Avsluta med
SendData ("CO")
End Sub
Public Sub SendData (ByVal Commandx som sträng)
På fel GoTo fel
Kommandot = Commandx
"kontrollera kommandot först
Kommandot = Trim(Command) ' ta bort extra blanksteg vid sidan
Om (InStr (kommandot, "") <> 0) eller (Len(Command) > 10) sedan "kommandot får inte vara längre än 10 char eller innehålla mellanslag
Gå till fel "skickar inte om kommandot format är fel
Slut om
Dim jag som heltal, röding som sträng
För i = 1 till 2 ' eftersom längden på ecpected karaktär är endast 2
Char = Mid (kommandot, i, 1)
Om (Char > = "A" och Char < = "Z") sedan "gör ingenting om 2 första tecken är alfabet
Annat
Gå till fel
Slut om
Nästa jag
"automatiskt hoppa för kommandon utan heltal CO, CT, RE
För i = 3 till Len(Command) ' se till att resten av kommandot är heltal
Char = Mid (kommandot, i, 1)
Om (Char > = "0" och Char < = "9") sedan "göra ingenting om återstående tecknen är siffror
Annat
Gå till fel
Slut om
Nästa jag
TextLength = Len(Command) ' ange förväntade textlength eko
Med Civilingenjörsexamen
. DTREnable = False
. RTSEnable = False "inaktivera begäran om att skicka signal
Om. PortOpen = falskt då. PortOpen = True "öppna porten
. Output = Commandx ' Skicka Text
. RThreshold = TextLength ' Spara skickade stränglängd
Slut med "lämna port öppen vänta på echo signalen att gå vidare
OnComm ' vänta för echo svar från Arduino
Exit Sub
Fel:
Om (Err.Description) sedan
MsgBox Err.Description
Annat
MsgBox "Ogiltigt kommando!"
Slut om
End Sub
Private Sub Log(Text As String)
På fel GoTo ERRR
tBox.Text = Text & vbCrLf & tBox.Text
Exit Sub
ERRR:
MsgBox "ett fel uppstod när loggning:" & Err.Description
Återuppta nästa
End Sub
"Manuell OnComm funktion att upptäcka eko av skickas data
Private Sub OnComm()
Dim InString som sträng, räknas som länge
Göra
DoEvents
Sömn (1)
Om räkningen > TimeOut då
MsgBox "Tid till nått!" & vbCrLf & "Inget svar från Arduino!"
Exit Sub
Slut om
Loop tills MComm.CommEvent = comEvReceive och MComm.InBufferCount > = TextLength
Sömn (5)
' Hämta alla tillgängliga data.
MComm.InputLen = 0
' Kontrollera om data.
Om MComm.InBufferCount > 0 då ' läsa data.
InString = MComm.Input
' Kontrollera om data som tas emot är som förväntat
Om InStr (InString, kommando) > 0 då "om kommandot ett eko
Annat
Gå till fel
Slut om
Om Len(InString) > 0 då "Output echo på textruta
tBox.Text = InString & tBox.Text
Slut om
Slut om
Om MComm.PortOpen sedan MComm.PortOpen = False ' stänger port efter att ha fått svar
Exit Sub
Fel:
Om (Err.Description) sedan
MsgBox Err.Description
Annat
MsgBox "Tar emot funktionen fel!"
Slut om
End Sub
Public Sub ExitLight()
SendData ("RE")
SendData ("CT")
Om MComm.PortOpen sedan MComm.PortOpen = False "om porten är öppen, stänga om innan utgång
End Sub
Public Function SimpleGet (Var_namn som sträng) som sträng
Statiska sLocalBuffer As String * 500
Dim l som heltal
l = GetPrivateProfileString (File_Section, Var_namn, vbNullString, sLocalBuffer, 500, filnamn)
SimpleGet = vänster$ (sLocalBuffer, l)
Slutet funktion