Daten von Arduino an VB

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Daten von Arduino an VB

    Hallo,

    ich versuche von einem Arduino zusammengesetzte Daten in Vb aufzuschlüssel um es in verschiedenen Textboxen anzuzeigen.
    Leider kann ich die daten für eine Textbox splitten, sobald ich mehrere einsetze bekomme ich eine Fehlermeldung :

    System.IndexOutofRangeException das Feld(1) ausserhalbe des Array wäre.

    Was mache ich falsch?

    Vielen Dank für die Hilfe

    Die Daten sind auf Arduino-Seite:

    C-Quellcode

    1. Serial.print(check0);
    2. Serial.print(",");
    3. Serial.print(check1);
    4. Serial.print(",");
    5. Serial.print(check2);
    6. Serial.print(",");
    7. Serial.print(check3);
    8. Serial.println(",");


    Auf der VB-Seite :

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO.Ports
    3. Public Class Form1
    4. Dim comPORT As String
    5. Dim Feld() As String
    6. Dim receivedData As String = ""
    7. Dim WithEvents serialPort As New SerialPort
    8. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    9. Timer1.Enabled = False
    10. comPORT = ""
    11. For Each sp As String In My.Computer.Ports.SerialPortNames
    12. comPort_ComboBox.Items.Add(sp)
    13. Next
    14. End Sub
    15. Private Sub comPort_ComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles comPort_ComboBox.SelectedIndexChanged
    16. If (comPort_ComboBox.SelectedItem <> "") Then
    17. comPORT = comPort_ComboBox.SelectedItem
    18. End If
    19. End Sub
    20. Private Sub connect_BTN_Click(sender As Object, e As EventArgs) Handles connect_BTN.Click
    21. If (connect_BTN.Text = "Connect") Then
    22. If (comPORT <> "") Then
    23. SerialPort1.Close()
    24. SerialPort1.PortName = comPORT
    25. SerialPort1.BaudRate = 115200
    26. SerialPort1.DataBits = 8
    27. SerialPort1.Parity = Parity.None
    28. SerialPort1.StopBits = StopBits.One
    29. SerialPort1.Handshake = Handshake.None
    30. SerialPort1.Encoding = System.Text.Encoding.Default 'very important!
    31. SerialPort1.ReadTimeout = 10000
    32. SerialPort1.Open()
    33. connect_BTN.Text = "Dis-connect"
    34. Timer1.Enabled = True
    35. Timer_LBL.Text = "Timer: ON"
    36. Else
    37. MsgBox("Select a COM port first")
    38. End If
    39. Else
    40. SerialPort1.Close()
    41. connect_BTN.Text = "Connect"
    42. Timer1.Enabled = False
    43. Timer_LBL.Text = "Timer: OFF"
    44. End If
    45. End Sub
    46. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    47. receivedData = ReceiveSerialData()
    48. Feld = receivedData.Split(",")
    49. RichTextBox1.Text = Feld(0)
    50. RichTextBox2.Text = Feld(1)
    51. RichTextBox3.Text = Feld(2)
    52. End Sub
    53. Function ReceiveSerialData() As String
    54. Dim Incoming As String
    55. Try
    56. Incoming = SerialPort1.ReadExisting()
    57. If Incoming Is Nothing Then
    58. Return "nothing" & vbCrLf
    59. Else
    60. Return Incoming
    61. End If
    62. Catch ex As TimeoutException
    63. Return "Error: Serial Port read timed out."
    64. End Try
    65. End Function
    66. Private Sub clear_BTN_Click(sender As Object, e As EventArgs) Handles clear_BTN.Click
    67. RichTextBox1.Text = ""
    68. RichTextBox2.Text = ""
    69. End Sub
    70. End Class


    Code-Tag eingefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    @OLMUK Willkommen im Forum. :thumbup:
    Offensichtlich willst Du auf einen Feldindex zugreifen, den es nicht gibt.
    Hast Du Dir die Daten angesehen, die Du splitten willst?
    Hast Du Dich überzeugt, dass das, was Du glaubst zu splitten, auch tatsächlich das ist, was Du splitten willst?
    In welcher Zeile kommt diese Exception?
    Lerne zu debuggen:
    Debuggen, Fehler finden und beseitigen
    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!
    das muss ich erst mal einzeln abarbeiten :

    Die Daten sind : Byte, Byte, Byte und wenn ich ohne Split sende kommt 1,2,3 an in der Textbox

    Mit Split und Feld(0) ist auch das erste byte abgetrennt, aber sobald ich Feld(1) hinzufüge kommt die
    Fehlermeldung...
    Kann ich das Array irgendwo festlegen ?

    OLMUK schrieb:

    Kann ich das Array irgendwo festlegen ?
    Zunächst solltest Du einen Haltepunkt setzen!
    Oder bist Du der Meinung, dass ein Code, der compiliert, fehlerfrei ist :?:
    Setze auf Zeile 57 Deines Codes einen Haltepunkt und sieh Dir an, was Du zu splitten gedenkst.
    Das Array ist die Variable Feld.
    ====
    Da ich nicht über Deine Hardware verfüge, kann ich nicht wissen, was in den Variablen steht.
    Das musst Du feststellen und entsprechend reagieren oder es uns mitteilen.
    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!
    Erst mal vielen Dank- leider verstehe ich nicht alles

    Habe versucht einen Haltpunkt einzufügen - geht nicht.

    Da ich ohne Split oder nur mit Feld(0) den richtigen Wert bekomme, müsste doch
    alles korrekt ankommen. Wie gesagt es kommt ohne Split in der Textbox 1,2,3 an
    und das ist exakt was ich sende.

    Ist denn der Ansatz nicht das Array zu definieren ( aber keines der gegoogelten Beispiele
    tun das ) ?

    OLMUK schrieb:

    geht nicht.
    Üblicherweise F9.

    OLMUK schrieb:

    müsste doch alles korrekt ankommen.
    Das nennen wir "Spekulatius".
    ====
    Kann es sein, dass Du Bytes sendest, aber Chars empfängst?
    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!
    ok, das war der richtige Hinweis -
    muss mich mal schlaumachen mit den Haltepunkten ( da ist eine Linie mit F9 )

    Hoffe ich nerve nicht zu arg mit den Basics - danke

    Habe etwas getestet mit Erfolg und es gibt keinen Fehler mehr mit dem Array.
    Also liegt mein Problem beim Sender

    Quellcode

    1. Dim Test As String = "1,2,3"
    2. 'RichTextBox1.Text = Test
    3. 'Feld = receivedData.Split(",")
    4. 'Feld = Split(receivedData, ",")
    5. Feld = Test.Split(New Char() {","c})
    6. RichTextBox1.Text = Feld(0)
    7. RichTextBox2.Text = Feld(1)
    8. RichTextBox3.Text = Feld(2)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „OLMUK“ ()

    @OLMUK Zeile 6 ist VB6-Code, das solltest Du vermeiden, sieh Dir mal das an:
    Visual Studio - Empfohlene Einstellungen
    Auf die Schnelle kannst Du auch receivedData in der Console ausgeben: Console.WriteLine(receivedData), die wird dann im Ausgabefenster des Studios ausgegeben.
    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!

    OLMUK schrieb:

    was spricht gegen vb6 ?
    Du hast VB.NET angeklickt, und die meisten Kollegen hier, die Dir helfen wollen, haben in ihren Einstellungen VB6 abgewählt.
    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!

    OLMUK schrieb:

    ist dies nicht relevant
    Äh - was jetzt?
    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!
    Hoffe deine Geduld nicht zu überdehnen ...

    Muss mich korrigieren das die auskommentierten ja nicht den char genommen haben.

    Habe zig Bücher aber wenn man nicht weiss nach was man suchen muss wird es schwierig...

    Mit der Verwendung von Visual Studio 2019 habe ich VB Net ??

    Hättest du bitte einen Tipp das grundsätzlich zu verstehen ?

    Schönes Wochenende

    OLMUK schrieb:

    habe ich VB Net ?
    Ja.
    Per Default werden über das SerialPort String-Daten mit ASCIIEncoding gesendet. Informiere Dich selbst, was das bedeutet!
    Überlege, Zeichen welchen Typs Du sendest und Zeichen welchen Typs Du empfängst.
    Welche Datentypen kommen da ühaupt in Frage?
    Informiere Dich und berichte. :thumbup:
    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!
    @Eierlein Jou, habich überlesen. :whistling:
    Default ist in diesem Kontext auch nicht viel besser, weil wir erst mal aufklären müssen, was der Arduino sendet.
    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!
    Hallo,

    ich möchte das Thema bitte nochmal aufgreifen :
    In der Zwischenzeit habe ich einiges gelernt, leider ist aber die Unsicherheit auch gestiegen.

    Die Übertragung des Strings (Beispiel ) 1,1,0,0,10,10,0,0, mit Ende Cr kommt in der GUI an.
    Die Anzahl der Werte ist immer gleich, nur der Inhalt ändert sich.
    Nach der Übergabe sollen die übernommenen Werte in ein Array " Feld() " geschrieben werden
    zur weiteren Verarbeitung.
    Die Splittung hat bereits funktioniert, leider scrollen nun die Werte durch.
    Ich finde den Fehler nicht, aber durch die Fehlersuche und den vielen Versuchen glaube ich das
    grundsätztlich nicht korrekt durchzuführen.
    Meine Btte richtet sich nicht zur Findung des Fehlers, sondern den Grundsatz der Splittung mit der
    Übernahme zu verstehen und (selbst) umzusetzen.

    Auszug des betreffenden Teiles :

    Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. receivedData = ReceiveSerialData()
    3. Dim s As String
    4. s = receivedData + "," + "," + "," + "," + "," + "," + ","
    5. Feld = s.Split(New Char() {","c})
    6. TextBox3.Text = s
    7. '*** Zuweisung Eingang Serielle Schnittstelle
    8. In_Rolle = Feld(0)
    9. In_Band = Feld(1)
    10. In_G1 = Feld(2)
    11. In_G2 = Feld(3)
    Nur ganz kurz:

    VB.NET-Quellcode

    1. Dim s As String
    2. s = receivedData + "," + "," + "," + "," + "," + "," + ","
    3. Feld = s.Split(New Char() {","c})

    ->

    VB.NET-Quellcode

    1. Dim s = receivedData & ",,,,,,," 'falls das inhaltlich überhaupt Sinn ergibt, aber am Inhalt habe ich ja nix geändert
    2. Feld = s.Split(","c)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das Ergebnis ist das Gleiche...

    Was ich bitte benötige ist die Übernahme in das Feld() Array nach dem CR nicht mehr zu verändern.

    Da ich in SPS Bahnen denke würde ich das MOVE mit einem Boolean verriegeln nach CR.
    Wie kann ich einen Boolean setzen wenn nach [data1, data2, data3, data4, data5, data6, data7, data8,]
    CR kommt?
    Mache ich mich verständlich ?