Datenübertragung zwischen Arduino und VB ( Problem mit mehreren PerformClick() )

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Datenübertragung zwischen Arduino und VB ( Problem mit mehreren PerformClick() )

    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


    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.IO.Ports
    3. Imports System.Threading
    4. Public Class Form1
    5. Private W001 As String
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As EventArgs) Handles MyBase.Load
    7. SerialPort101.Close()
    8. SerialPort101.PortName = "com101" 'Port für GBM
    9. SerialPort101.BaudRate = 115200
    10. SerialPort101.DataBits = 8
    11. SerialPort101.Parity = Parity.None
    12. SerialPort101.StopBits = StopBits.One
    13. SerialPort101.Handshake = Handshake.None
    14. SerialPort101.Encoding = System.Text.Encoding.Default
    15. SerialPort101.Open()
    16. End Sub
    17. Private Sub Button1001_Click(sender As Object, e As EventArgs) Handles Button1001.Click
    18. sendenCV1001()
    19. End Sub
    20. Sub sendenCV1001()
    21. SerialPort101.Write("<1>") 'ein
    22. SerialPort101.Write("<R 1 11111 22222>")
    23. SerialPort101.Write("<0>")
    24. End Sub
    25. Private Sub Button1003_Click(sender As Object, e As EventArgs) Handles Button1003.Click
    26. sendenCV1003()
    27. End Sub
    28. Sub sendenCV1003()
    29. SerialPort101.Write("<1>") 'ein
    30. SerialPort101.Write("<R 3 11111 22222>")
    31. SerialPort101.Write("<0>")
    32. End Sub
    33. Private Sub Button1004_Click(sender As Object, e As EventArgs) Handles Button1004.Click
    34. sendenCV1004()
    35. End Sub
    36. Sub sendenCV1004()
    37. SerialPort101.Write("<1>") 'ein
    38. SerialPort101.Write("<R 4 11111 22222>")
    39. SerialPort101.Write("<0>")
    40. End Sub
    41. Private Sub Button1008_Click(sender As Object, e As EventArgs) Handles Button1008.Click
    42. sendenCV1008()
    43. End Sub
    44. Sub sendenCV1008()
    45. SerialPort101.Write("<1>") 'ein
    46. SerialPort101.Write("<R 8 11111 22222>")
    47. SerialPort101.Write("<0>")
    48. End Sub
    49. Private Sub Button1029_Click(sender As Object, e As EventArgs) Handles Button1029.Click
    50. sendenCV1029()
    51. End Sub
    52. Sub sendenCV1029()
    53. SerialPort101.Write("<1>") 'ein
    54. SerialPort101.Write("<R 29 11111 22222>")
    55. SerialPort101.Write("<0>")
    56. End Sub
    57. 'AUSLESEN
    58. Private Sub SerialPort101_DataReceived001(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort101.DataReceived
    59. Me.AppendText1(Me.SerialPort101.ReadExisting())
    60. End Sub
    61. Private Sub AppendText1(txt As String)
    62. If Me.InvokeRequired Then
    63. Dim ac = New Action(Of String)(AddressOf AppendText1)
    64. Me.Invoke(ac, txt)
    65. Return
    66. End If
    67. Me.W001 = txt
    68. RichTextBox1.AppendText(txt)
    69. RichTextBox1.ScrollToCaret()
    70. Dim str As String = txt
    71. Dim extr1 As String = ""
    72. Dim start1 As Integer = str.LastIndexOf("|") + 1 'von letzten |
    73. Dim [end1] As Integer = str.IndexOf(" ") 'bis zum Leerzeichen
    74. Dim extr2 As String = ""
    75. Dim start2 As Integer = str.LastIndexOf(" ") + 1 'von letzten Leerzeihen
    76. Dim [end2] As Integer = str.IndexOf(">") 'bis zum GroeSerzeichen
    77. If start1 >= 0 AndAlso [end1] > start1 Then 'Wenn Start ist größer 0 und IntArray ist größer als Start
    78. extr1 = str.Substring(start1, [end1] - start1) 'Gesuchter Wert ist ab der Stelle "Start1" bis zum IntArray-Wert minus Start1, gespeichert in der Variable "extr1"
    79. End If
    80. Label1.Text = extr1 'Wert an Label1 übergeben
    81. If start2 >= 0 AndAlso [end2] > start2 Then 'Wenn Start ist größer 0 und IntArray ist größer als Start
    82. extr2 = str.Substring(start2, [end2] - start2) 'Gesuchter Wert ist ab der Stelle "Start2" bis zum IntArray-Wert minus Start2, gespeichert in der Variable "extr2"
    83. End If
    84. Label2.Text = extr2 'Wert an Label2 übergeben
    85. '----------------------------------------
    86. If extr1.Contains("1") Then
    87. CV1001()
    88. End If
    89. If extr1.Contains("3") Then
    90. CV1003()
    91. End If
    92. If extr1.Contains("4") Then
    93. CV1004()
    94. End If
    95. If extr1.Contains("8") Then
    96. CV1008()
    97. End If
    98. If extr1.Contains("29") Then
    99. CV1029()
    100. End If
    101. End Sub
    102. Sub CV1001()
    103. Label1001.Text = "gelesene CV = " + Label1.Text
    104. Label2001.Text = "gelesener Wert = " + Label2.Text
    105. End Sub
    106. Sub CV1003()
    107. Label1003.Text = "gelesene CV = " + Label1.Text
    108. Label2003.Text = "gelesener Wert = " + Label2.Text
    109. End Sub
    110. Sub CV1004()
    111. Label1004.Text = "gelesene CV = " + Label1.Text
    112. Label2004.Text = "gelesener Wert = " + Label2.Text
    113. End Sub
    114. Sub CV1008()
    115. Label1008.Text = "gelesene CV = " + Label1.Text
    116. Label2008.Text = "gelesener Wert = " + Label2.Text
    117. End Sub
    118. Sub CV1029()
    119. Label1029.Text = "gelesene CV = " + Label1.Text
    120. Label2029.Text = "gelesener Wert = " + Label2.Text
    121. End Sub
    122. ' alle lesen
    123. Private Sub ButtonALLE1_Click(sender As Object, e As EventArgs) Handles ButtonALLE1.Click
    124. Button1001.PerformClick()
    125. Button1003.PerformClick()
    126. Button1004.PerformClick()
    127. Button1008.PerformClick()
    128. Button1029.PerformClick()
    129. End Sub
    130. End Class

    Lennart schrieb:

    Aber siehe da: nach dem 3'ten klick (Button1004.PerformClick() ist immer schluss.
    Kommunikation mit Hardware ist ein langwierig Ding.
    Du kommunizierst asynchron, Du sendest einen Befehl, und während die Hardware noch sinniert, was zu tun ist, sendest Du bereits den nächsten Befehl, da kommt jede Hardware aus dem Tritt.
    Ich empfehle Dir, synchron zu kommunizieren.
    Bei mir heißt der entsprechende Befekl SendCommandWait4Answer():

    Quellcode

    1. Send()
    2. Sleep()
    3. Read()

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!