Hallo und schönen Abend aus dem Alpenland!
Im unteren Code kommuniziere ich zwischen VB über einen Arduino zu einer Modellbahnlokomotive.
Ich sende per Button über den SerialPort101 den Befehl z.B. <R 1 11111 22222> an den Arduino,
der weiter an die Lok. Diese "schreibt mir z.B.zurück <r11111|22222|1 2>.
Ich extrahiere mir dann aus diesem meine Info's für z.B. Label1001.Text.
Ich habe 5 Buttons für 5 vordefinierte SENDE-Befehle, das funktioniert alles perfekt.
Jetzt zum Problem: Sehr oft kommt es vor das ich alle 5 Buttons hintereinander clicken muss um ALLE Info's aus
der LOK zu bekommen. Also meine naive Idee:
Button1001.PerformClick()
Button1003.PerformClick()
Button1004.PerformClick()
Button1008.PerformClick()
Button1029.PerformClick()
Aber siehe da: nach dem 3'ten klick (Button1004.PerformClick() ist immer schluss.
aber WARUM ??? Wenn ich mich händisch durch die 5 Button's clicke gibt's kein Problem, stundenlang keins.
Könnt Ihr mir da was lernen was ich falsch oder fehlend mache? DANK EUCH
Lenny
Im unteren Code kommuniziere ich zwischen VB über einen Arduino zu einer Modellbahnlokomotive.
Ich sende per Button über den SerialPort101 den Befehl z.B. <R 1 11111 22222> an den Arduino,
der weiter an die Lok. Diese "schreibt mir z.B.zurück <r11111|22222|1 2>.
Ich extrahiere mir dann aus diesem meine Info's für z.B. Label1001.Text.
Ich habe 5 Buttons für 5 vordefinierte SENDE-Befehle, das funktioniert alles perfekt.
Jetzt zum Problem: Sehr oft kommt es vor das ich alle 5 Buttons hintereinander clicken muss um ALLE Info's aus
der LOK zu bekommen. Also meine naive Idee:
Button1001.PerformClick()
Button1003.PerformClick()
Button1004.PerformClick()
Button1008.PerformClick()
Button1029.PerformClick()
Aber siehe da: nach dem 3'ten klick (Button1004.PerformClick() ist immer schluss.
aber WARUM ??? Wenn ich mich händisch durch die 5 Button's clicke gibt's kein Problem, stundenlang keins.
Könnt Ihr mir da was lernen was ich falsch oder fehlend mache? DANK EUCH
Lenny
VB.NET-Quellcode
- Imports System.IO
- Imports System.IO.Ports
- Imports System.Threading
- Public Class Form1
- Private W001 As String
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As EventArgs) Handles MyBase.Load
- SerialPort101.Close()
- SerialPort101.PortName = "com101" 'Port für GBM
- SerialPort101.BaudRate = 115200
- SerialPort101.DataBits = 8
- SerialPort101.Parity = Parity.None
- SerialPort101.StopBits = StopBits.One
- SerialPort101.Handshake = Handshake.None
- SerialPort101.Encoding = System.Text.Encoding.Default
- SerialPort101.Open()
- End Sub
- Private Sub Button1001_Click(sender As Object, e As EventArgs) Handles Button1001.Click
- sendenCV1001()
- End Sub
- Sub sendenCV1001()
- SerialPort101.Write("<1>") 'ein
- SerialPort101.Write("<R 1 11111 22222>")
- SerialPort101.Write("<0>")
- End Sub
- Private Sub Button1003_Click(sender As Object, e As EventArgs) Handles Button1003.Click
- sendenCV1003()
- End Sub
- Sub sendenCV1003()
- SerialPort101.Write("<1>") 'ein
- SerialPort101.Write("<R 3 11111 22222>")
- SerialPort101.Write("<0>")
- End Sub
- Private Sub Button1004_Click(sender As Object, e As EventArgs) Handles Button1004.Click
- sendenCV1004()
- End Sub
- Sub sendenCV1004()
- SerialPort101.Write("<1>") 'ein
- SerialPort101.Write("<R 4 11111 22222>")
- SerialPort101.Write("<0>")
- End Sub
- Private Sub Button1008_Click(sender As Object, e As EventArgs) Handles Button1008.Click
- sendenCV1008()
- End Sub
- Sub sendenCV1008()
- SerialPort101.Write("<1>") 'ein
- SerialPort101.Write("<R 8 11111 22222>")
- SerialPort101.Write("<0>")
- End Sub
- Private Sub Button1029_Click(sender As Object, e As EventArgs) Handles Button1029.Click
- sendenCV1029()
- End Sub
- Sub sendenCV1029()
- SerialPort101.Write("<1>") 'ein
- SerialPort101.Write("<R 29 11111 22222>")
- SerialPort101.Write("<0>")
- End Sub
- 'AUSLESEN
- Private Sub SerialPort101_DataReceived001(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort101.DataReceived
- Me.AppendText1(Me.SerialPort101.ReadExisting())
- End Sub
- Private Sub AppendText1(txt As String)
- If Me.InvokeRequired Then
- Dim ac = New Action(Of String)(AddressOf AppendText1)
- Me.Invoke(ac, txt)
- Return
- End If
- Me.W001 = txt
- RichTextBox1.AppendText(txt)
- RichTextBox1.ScrollToCaret()
- Dim str As String = txt
- Dim extr1 As String = ""
- Dim start1 As Integer = str.LastIndexOf("|") + 1 'von letzten |
- Dim [end1] As Integer = str.IndexOf(" ") 'bis zum Leerzeichen
- Dim extr2 As String = ""
- Dim start2 As Integer = str.LastIndexOf(" ") + 1 'von letzten Leerzeihen
- Dim [end2] As Integer = str.IndexOf(">") 'bis zum GroeSerzeichen
- If start1 >= 0 AndAlso [end1] > start1 Then 'Wenn Start ist größer 0 und IntArray ist größer als Start
- extr1 = str.Substring(start1, [end1] - start1) 'Gesuchter Wert ist ab der Stelle "Start1" bis zum IntArray-Wert minus Start1, gespeichert in der Variable "extr1"
- End If
- Label1.Text = extr1 'Wert an Label1 übergeben
- If start2 >= 0 AndAlso [end2] > start2 Then 'Wenn Start ist größer 0 und IntArray ist größer als Start
- extr2 = str.Substring(start2, [end2] - start2) 'Gesuchter Wert ist ab der Stelle "Start2" bis zum IntArray-Wert minus Start2, gespeichert in der Variable "extr2"
- End If
- Label2.Text = extr2 'Wert an Label2 übergeben
- '----------------------------------------
- If extr1.Contains("1") Then
- CV1001()
- End If
- If extr1.Contains("3") Then
- CV1003()
- End If
- If extr1.Contains("4") Then
- CV1004()
- End If
- If extr1.Contains("8") Then
- CV1008()
- End If
- If extr1.Contains("29") Then
- CV1029()
- End If
- End Sub
- Sub CV1001()
- Label1001.Text = "gelesene CV = " + Label1.Text
- Label2001.Text = "gelesener Wert = " + Label2.Text
- End Sub
- Sub CV1003()
- Label1003.Text = "gelesene CV = " + Label1.Text
- Label2003.Text = "gelesener Wert = " + Label2.Text
- End Sub
- Sub CV1004()
- Label1004.Text = "gelesene CV = " + Label1.Text
- Label2004.Text = "gelesener Wert = " + Label2.Text
- End Sub
- Sub CV1008()
- Label1008.Text = "gelesene CV = " + Label1.Text
- Label2008.Text = "gelesener Wert = " + Label2.Text
- End Sub
- Sub CV1029()
- Label1029.Text = "gelesene CV = " + Label1.Text
- Label2029.Text = "gelesener Wert = " + Label2.Text
- End Sub
- ' alle lesen
- Private Sub ButtonALLE1_Click(sender As Object, e As EventArgs) Handles ButtonALLE1.Click
- Button1001.PerformClick()
- Button1003.PerformClick()
- Button1004.PerformClick()
- Button1008.PerformClick()
- Button1029.PerformClick()
- End Sub
- End Class