Hallo, ich bin neu hier im Forum und Anfänger sowie Autodidakt was Programmierung angeht. Also bitte nicht gleich steinigen, wenn ich in ein Fettnäpfchen trete.
Ich arbeite in Visual Studio 2017. Leider kann ich euch nicht sagen, ob ich "VB6" oder "VB.net" nutze.
Ziel meines Programms:
Die Werte mehrerer Sensorsen am Arduino werden über das USB-Kabel und die virtuelle serielle Schnittstelle gesendet und sollen am PC ausgewertet werden. Um die Werte der einzelnen Sensoren am PC unterscheiden zu können, setzt der Arduino vor die jeweiligen Werte einen festgelegten Buchstaben. Aus „180“ wird „P180“ beim Drucksensor und bei der Abstandsmessung wir aus „0“ ein „D0“ gesendet. Im Programm prüfe ich dann den ersten Buchstaben und lasse dann den Wert ohne den Buchstaben „P“ oder „D“ entsprechend in ComboBox1 oder ComboBox2 ausgeben. Insofern der Arduino die Werte alle 200ms schickt, funktioniert alles bestens.
Auf dem Bild seht ihr, was der Arduino sendet:
Hier seht ihr, wie es sein soll und bei 200ms Delay auch funktioniert:
Problem:
Reduziere ich das Delay in der Loop des Arduino, stelle ich Fehler im Eintrag in der ComboBox fest. Scheinbar schafft es mein Programm nicht, die Buchstaben „schnell genug“ zu entfernen. Die Einträge in den Comboboxen haben nun die „P“ und „D“ vorangestellt. Je schneller ich den Arduino die Daten schicken lassen (also je geringer das Delay), desto häufiger treten die Fehler auf.
Ich lasse im Programm folgendes mit den eingehenden Werten anstellen:
Das Erhöhen der Baudrate hat keine Veränderung gebracht, ist m.E. auch irrelevant, wenn ich mit Delay arbeite, oder?
Ich kann mir kaum vorstellen, dass mein Core i7 zu langsam ist, um die paar Operation schnell genug auszuführen? Wie oben geschrieben, ich bin kein gelernter Programmierer. Könnt ihr mir weiterhelfen und/oder einen Tipp geben? Schon mal vielen Dank für eure Hilfe!
Falls ihr dafür noch wissen müsst, wie ich den seriellen Port eingebunden habe:
Ich arbeite in Visual Studio 2017. Leider kann ich euch nicht sagen, ob ich "VB6" oder "VB.net" nutze.
Ziel meines Programms:
Die Werte mehrerer Sensorsen am Arduino werden über das USB-Kabel und die virtuelle serielle Schnittstelle gesendet und sollen am PC ausgewertet werden. Um die Werte der einzelnen Sensoren am PC unterscheiden zu können, setzt der Arduino vor die jeweiligen Werte einen festgelegten Buchstaben. Aus „180“ wird „P180“ beim Drucksensor und bei der Abstandsmessung wir aus „0“ ein „D0“ gesendet. Im Programm prüfe ich dann den ersten Buchstaben und lasse dann den Wert ohne den Buchstaben „P“ oder „D“ entsprechend in ComboBox1 oder ComboBox2 ausgeben. Insofern der Arduino die Werte alle 200ms schickt, funktioniert alles bestens.
Auf dem Bild seht ihr, was der Arduino sendet:
Hier seht ihr, wie es sein soll und bei 200ms Delay auch funktioniert:
Problem:
Reduziere ich das Delay in der Loop des Arduino, stelle ich Fehler im Eintrag in der ComboBox fest. Scheinbar schafft es mein Programm nicht, die Buchstaben „schnell genug“ zu entfernen. Die Einträge in den Comboboxen haben nun die „P“ und „D“ vorangestellt. Je schneller ich den Arduino die Daten schicken lassen (also je geringer das Delay), desto häufiger treten die Fehler auf.
Ich lasse im Programm folgendes mit den eingehenden Werten anstellen:
Visual Basic-Quellcode
- Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
- receivedData = ReceiveSerialData()
- If receivedData.Length > 0 Then If receivedData.Substring(0, 1) = "D" Then Dist(receivedData)
- If receivedData.Length > 0 Then If receivedData.Substring(0, 1) = "P" Then Pres(receivedData)
- End Sub
- Private Sub Dist(D As String)
- D = D.Remove(0, 1)
- RichTextBox1.Text &= D
- If IsNumeric(D) Then
- dldo = Int(D)
- If DDState Then DDout(Int(D)) Else DDin(Int(D))
- End If
- End Sub
- Private Sub Pres(P As String)
- P = P.Remove(0, 1)
- RichTextBox2.Text &= P
- If IsNumeric(P) Then
- dldo = Int(P)
- If DDState Then DDout(Int(P)) Else DDin(Int(P))
- End If
- End Sub
- Private Sub DDin(vl As Integer)
- If vl < DDInVAL.Value Then
- DDState = True
- BlowTM.Enabled = False
- BlowTM.Enabled = True
- End If
- End Sub
- Private Sub DDout(vl As Integer)
- If vl > DDoutVal.Value Then
- DDState = False
- BlowTM.Enabled = False
- BlowTM.Enabled = True
- End If
- End Sub
Das Erhöhen der Baudrate hat keine Veränderung gebracht, ist m.E. auch irrelevant, wenn ich mit Delay arbeite, oder?
Ich kann mir kaum vorstellen, dass mein Core i7 zu langsam ist, um die paar Operation schnell genug auszuführen? Wie oben geschrieben, ich bin kein gelernter Programmierer. Könnt ihr mir weiterhelfen und/oder einen Tipp geben? Schon mal vielen Dank für eure Hilfe!
Falls ihr dafür noch wissen müsst, wie ich den seriellen Port eingebunden habe:
Visual Basic-Quellcode
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles connect_BTN.Click
- If (connect_BTN.Text = "Connect") Then
- If (comPORT <> "") Then
- SerialPort1.Close()
- SerialPort1.PortName = comPORT
- SerialPort1.BaudRate = 115200
- SerialPort1.DataBits = 8
- SerialPort1.Parity = Parity.None
- SerialPort1.StopBits = StopBits.One
- SerialPort1.Handshake = Handshake.None
- SerialPort1.Encoding = System.Text.Encoding.Default
- SerialPort1.ReadTimeout = 10000
- SerialPort1.Open()
- connect_BTN.Text = "Dis-connect"
- Timer1.Enabled = True
- Timer_LBL.Text = "Timer: ON"
- Else
- MsgBox("Select a COM port first")
- End If
- Else
- SerialPort1.Close()
- connect_BTN.Text = "Connect"
- Timer1.Enabled = False
- Timer_LBL.Text = "Timer: OFF"
- End If
- End Sub