GUI Sendet und empfängt über Serial daten über Arduino

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von milito.

    GUI Sendet und empfängt über Serial daten über Arduino

    Hallo, brauche mal wieder einen Tipp und zwar:
    habe ich eine GUI in Visual Basic geschrieben, die über den USB anschluss Daten an den Arduino sendet und diese in die SD-Karte speichert. Außerdem wird über den button receive die SD-Karte ausgelesen und an die GUI gesendet. Das funkitonier auch alles soweit nur mit einem schönheitsfehler.
    Diese Parameter, die gesendet werden(3 parameter werden auf einnmal gesendet) sollen zeilenweise in die csv.Datei gespeichert werden.
    zb: 2;3;2
    2;3;0

    doch manchmal werden sie folgendermaßen in die Datei eingetragen: 2;3;3;2;3;0
    er macht es aber nicht immer, jetzt weiß ich nicht woran es liegt, kann mir jemand eventuell helfen?
    anbei noch meinen code dazu:

    Sorry für die formatierung, aber mit den code-tags hat das nicht geklappt bzw. die formatierung ist nicht ok

    VB.NET-Quellcode

    1. Dim inputdata As String
    2. 'Dim kontrol_receive As Integer = 1 'kontrolvariable für Empfangen von Arduino
    3. Dim kontrol_receive As String = "$"
    4. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_i2c_receive.Click
    5. RichTextBox1.ForeColor = Color.Black
    6. '/------Kontrollvariale an Arduino =1 , somit weiß er das er an GUI senden soll---/
    7. If Not SerialPort_i2c.IsOpen = True Then
    8. SerialPort_i2c.Open()
    9. End If
    10. SerialPort_i2c.Write("$") 'kontrollvariable
    11. End Sub
    12. Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort_i2c.DataReceived
    13. 'das was an buffer ist wird an variable drangehängt und somit nicht ueberschrieben
    14. inputdata = inputdata & SerialPort_i2c.ReadExisting
    15. 'HIer wird die funktion aufgerufen, weil damit gibt eskeine verzögerung,
    16. 'd.h. da wird alles was im EMpfangsbuffer anliegt ausgelesen und ausgegeben. -> brauche im Event vom Button klick nicht definieren
    17. 'da arduino nur sendet wenn er Dollarzeichen erhält, also -> receive, da kommt erst eventhandler datarecieved zum arbeiten
    18. Me.Invoke(Sub()
    19. RichTextBox1.Text = inputdata
    20. End Sub)
    21. End Sub
    22. Dim kontrol_sende As String = "&" 'kontrolvariable für Senden an Arduino
    23. Private Sub btn_i2c_send_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_i2c_send.Click
    24. 'Mit try wird versucht Übertragung an Arduino durchzuführen'
    25. Try
    26. 'öffne Serielle Anschlussverbindung, sofern nicht bereits geöffnet'
    27. If Not SerialPort_i2c.IsOpen Then SerialPort_i2c.Open()
    28. 'SerialPort_i2c.Write("&") 'sende kontrollvariable
    29. 'falls Verbindung zum Device besteht, doch es wird auf sendbutton gedrückt und leere Texbox, meldung + verbindung schliessen
    30. 'Falls Enable-box aktiviert, dann sende kontrollvariable, damit pin am arduino auf high gesetzt wird
    31. If CheckBox_EN.Checked = True Then
    32. SerialPort_i2c.Write("&")
    33. End If
    34. SerialPort_i2c.Write(Numeric_addr_i2c.Value & ";") '; damit in csv datei in spalten
    35. SerialPort_i2c.Write(Numeric_reg_i2c.Value & ";")
    36. If CheckBox_i2c.Checked = True Then
    37. SerialPort_i2c.Write(Numeric_data_i2c.Value) 'durch vbr = Enter, d.h. wenn ein ganzer String wird ein enter gesendet und arduino weiß ok gsnzer String
    38. End If
    39. SerialPort_i2c.Write(vbCr)
    40. MsgBox("Transfer successful")
    41. If SerialPort_i2c.IsOpen = True Then
    42. SerialPort_i2c.Close()
    43. End If
    44. 'Falls Übertragung fehlschlägt, Catch block um fehler auszubügeln und eigene message von vb'
    45. Catch ex As Exception
    46. MsgBox("Transfer failed - Please check the connection" & vbCrLf & ex.Message)
    47. End Try
    48. 'Nach Übertragung Port wieder freistellen'
    49. 'If SerialPort_i2c.IsOpen = True Then
    50. 'SerialPort_i2c.Close()
    51. 'End If
    52. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „milito“ ()

    Hey,

    Ich und auch andere würden dir bestimmt helfen, nur dein Code ist so ziemlich schwer zu lesen. Könntest du deinen Code bitte in VB Tags darstellen, dann ist uns sehr geholfen ;)

    Gruß OneWorld
    Youtube Info Library 2013 jetzt im Showroom.
    Sorry, ok habs jetzt formatiert.
    Würd mich sehr freuen, wenn mir jemand das einen tipp geben kann , woran es liegt.
    Braucht ihr noch den Arduino code dazu?

    Das is der arduino code:

    VB.NET-Quellcode

    1. void setup()
    2. {
    3. //Serialport verbindung mit 9600Baudrate
    4. Serial.begin(9600);
    5. /*########LED Konfig#########*/
    6. pinMode(ledPin1, OUTPUT);
    7. pinMode(ledPin2,OUTPUT);
    8. /*#######ENABLE-PIN########*/
    9. pinMode(EN,OUTPUT);
    10. /*###########################*/
    11. /*ChipSelect Pin , den standard als Ausgangs sonst geht SD library nicht*/
    12. pinMode(53, OUTPUT);
    13. /*######################################################################*/
    14. /*############################Taster-Konfig####################################*/
    15. pinMode(kipp_left, INPUT_PULLUP); //kippstellung links in pin30 INPUT_PULLUP->interner pullup, somit pullup aktivieren
    16. pinMode(kipp_right, INPUT_PULLUP);//kippstellung rechts in pin31 und wird input-widerstand aktiviert (intern)
    17. /*kippleft= low -> linksstellung
    18. kippright= low= rechtsstellung
    19. kippleft & kippright = HIGH -> mittelstellung */
    20. /*##############################################################################*/
    21. }
    22. void loop()
    23. {
    24. //wird ein zeichen über Serialport empfangen?
    25. if (Serial.available() > 0)
    26. {
    27. //falls ja, schreibe diesen in inByte
    28. inByte = Serial.read();
    29. /*##################################I2C################################*/
    30. //falls inByte= $ -> ASCII(36), Arduino im Sendemodus
    31. if (inByte==36)//falls $=36 ankommt arduino sendet, sonst empfangen
    32. {
    33. blink_send();
    34. read_SD();
    35. }//endif
    36. if (inByte==63) //falls ?=63 in Byte dann führe funktion i2c-scan durch
    37. {
    38. i2c_scan();
    39. }
    40. if(inByte==38)
    41. {
    42. digitalWrite(EN,HIGH);
    43. Serial.println("EN-EIN");
    44. }
    45. //falls Arduino &(38) empfängt , d.h. er empfänngt von GUI
    46. else //(inByte==38)
    47. {
    48. blink_receive();
    49. write_SD();
    50. }//endif
    51. /*###############################SPI###################################*/
    52. //falls Arduinio ascii(33)->! empfängt, dann soll er in datei für spi dieparameter schreiben
    53. if(inByte==33)
    54. {
    55. write_spi();
    56. }//endif
    57. if (inByte==35)
    58. {
    59. read_spi();
    60. }//endif
    61. }//endif serial available
    62. void write_SD()
    63. {
    64. if (Serial.available()>0)
    65. {
    66. if (inByte ==13) //enter
    67. {
    68. Serial.print("Initializing SD Card...");
    69. if (!SD.begin(chipSelect))
    70. {
    71. Serial.println("Initialization failed");
    72. return; //tue nichts
    73. }//endif
    74. Serial.println("SD Card initialized");
    75. if (SD.exists("test2.csv"))
    76. {
    77. Serial.print("File exists");
    78. }
    79. else
    80. {
    81. Datei=SD.open("test2.csv", O_CREAT | O_WRITE);
    82. Datei.println("Adresse;Register;Data");
    83. Datei.close();
    84. }
    85. //Schreibzugriff
    86. Datei= SD.open("test2.csv", O_CREAT | O_WRITE); //Das gleiche wie FILE_WRITE. doch es beschleunigt das Schrieben auf SD
    87. //Datei=SD.open("test2.txt", FILE_WRITE);
    88. //falls Datei ok, schreibe
    89. if (Datei)
    90. {
    91. //delay(150); //verzögerung, da schreiben auf SD karte langsamer ist
    92. //Datei.write(Test); //ohne zeilenumbruch
    93. //Datei.write(13); //schreibe nach jedem eintrag ein carriage return line feed, damit strings zeilenweise einetragen werden
    94. Datei.println(Text);
    95. //inhalt von Array Text in SD schreiben(commands.txt)-> println mit zeilenumbruch
    96. Datei.close(); //Damit änderung gespeichert werden, diese Datei schliessen
    97. Serial.println("Data stored in SD card");
    98. /*Nachdem enter gekommen ist und daten gespeichert wurden
    99. setze Array wieder auf 0 und lösche inhalt*/
    100. index=0; //index auf 0 initialisieren
    101. memset(&Text[0], 0, sizeof(Text)); //durch memset wird Array gelöscht
    102. Serial.println("Array initialized");
    103. }//endif datei vorhanden?
    104. }//endif kontroll enter
    105. else//fals kein enter,soll weiter in array speichern
    106. {
    107. if (index <400)//schauen , ob array overflow hat
    108. {
    109. Text[index]=inByte; //solange kein ´Enter vom Arduino empfangen wird, schreibe in Array
    110. index++; //und zähle position hoch -> z.b. wenn ich hallo sende-> jeder buchstabe bekommt eine position
    111. }//endif check array of overfolw
    112. }//end else
    113. }//endif serial available
    114. }//end fu

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

    Hey,

    Na das ist doch schon besser. Schau dich mal hier im Forum um. Hier gibt es einen Thread der Heißt VB-Tags richtig benutzen glaub ich, denn ich finde ihn grade nicht ;)
    Zu deinem Problem. Versuch mal mit Environment.NewLine einen Absatz zu schreiben, also z.b. so:

    VB.NET-Quellcode

    1. Dim StringtoWrite as String = ("Hier dein Zeugs, welches du schreiben möchtest" & Environment.NewLine)


    Damit erzeugst du nach jeder Zeile, die du in die Datei schreibst einen Absatz.

    Vielleicht hilft das

    Gruß OneWorld
    Youtube Info Library 2013 jetzt im Showroom.
    das newline sollte erst gesetzt werden wenn alles 2 bzw 3 parameter gesender werden, d.h. nach jeden 3 parameter.
    Außerdem brauche ich das vbcr afür, damit der arduino weiß, dass keine zeichen mehr kommen.

    Wo sollte ich es einsetzen?
    Du sagst ja, dass 3 Parameter in die Datei geschrieben werden sollen zb: 2;3;2. Danach werden nochmal 3 Parameter gesendet. Diese sollen untereinander eingetragen werden also so:

    2;3;2
    2;3;0

    Dann müsstest du das Environment.NewLine zwischen den ersten und den zweiten Parameter setzen.

    2;3;2
    Environment.NewLine
    2;3;0

    Nur warum schreibt er dann manchmal in die nächste Zeile und das andere Mal nicht ? 8|

    Gruß
    Youtube Info Library 2013 jetzt im Showroom.
    ja das frage ich mich auch, warum er das macht?


    so also meinst du so:

    VB.NET-Quellcode

    1. SerialPort_i2c.Write(Numeric_addr_i2c.Value & ";") '; damit in csv datei in spalten
    2. SerialPort_i2c.Write(Numeric_reg_i2c.Value & ";")
    3. If CheckBox_i2c.Checked = True Then
    4. SerialPort_i2c.Write(Numeric_data_i2c.Value) 'durch vbr = Enter, d.h. wenn ein ganzer String wird ein enter gesendet und arduino weiß ok gsnzer String
    5. End If
    6. SerialPort_i2c.Write(Environment.NewLine)
    Wenn das da ist, wo die ersten Parameter erfolgreich und komplett übertragen wurden ja. Ich übernehme aber keine Haftung wenns kaputt geht :D

    Gruß
    Youtube Info Library 2013 jetzt im Showroom.
    Mach das ;)

    Du kannst das Environment.Newline als "Enter" sehen. Es bewirkt den selben Effekt, wenn du Enter in einem Textdokument machst. Du springts in eine neue Zeile und dein Programm macht das auch ;)

    Gruß
    Youtube Info Library 2013 jetzt im Showroom.
    So habs nun versucht mit dem NewLine es is besser geworden, habe das problem, dass er manchmal das Steuerzeichen, in diesem Fall das "$", dass ich über Serial an dem Arduino absende , damit dieser weiß, dass er in die SD schreiben muss mit schreibt(siehe code oben).
    Was könnte das sein?
    Zu dem Dim kontrol_receive As String = "$" kann ich nicht viel sagen, da es oben im Code nur deklariert und nicht verwendet wird. Kannst du uns die Stelle zeigen ?

    Gruß OneWorld
    Youtube Info Library 2013 jetzt im Showroom.

    OneWorld schrieb:

    Zu dem Dim kontrol_receive As String = "$" kann ich nicht viel sagen, da es oben im Code nur deklariert und nicht verwendet wird. Kannst du uns die Stelle zeigen ?

    Gruß OneWorld
    Ja also sorry das ist die Stelle in dem Send event:

    VB.NET-Quellcode

    1. SerialPort_i2c.Write("$")'kontrollvariable



    hätte auch kontrol_receive schreiben können
    Das darfst du natürlich nicht erneut senden. Das sendest du als erstes und anschließend sendest du deine anderen Sachen. Ich weiß natürlich jetzt nicht, wie die gesamte stelle aussieht. Bitte ggf. mal posten ;)

    Gruß
    Youtube Info Library 2013 jetzt im Showroom.
    Also das ist diese Stelle im VB -Code hab gerade gemerkt, dass ich mich verschrieben habe und zwar das $ wird beim betätigen des Receive-Button gesendet(GUI empfängt daten vom Arduino)

    Das ist die Stelle:

    VB.NET-Quellcode

    1. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_i2c_receive.Click RichTextBox1.ForeColor = Color.Black
    2. If Not SerialPort_i2c.IsOpen = True Then SerialPort_i2c.Open()
    3. End If
    4. SerialPort_i2c.Write("$") 'kontrollvariable 'SerialPort_i2c.Close()
    5. End Sub

    kann es vllt sein, dass wenn ich das $ sende ich den Port schliessen muss, beim empfangen.

    Das empfangen geht über den Eventhandler Datareceive (habe es von diesem Forum)
    siehe hier:

    VB.NET-Quellcode

    1. Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort_i2c.DataReceived 'das was an buffer ist wird an variable drangehängt und somit nicht ueberschriebeninputdata = inputdata & SerialPort_i2c.ReadExisting'HIer wird die funktion aufgerufen, weil damit gibt eskeine verzögerung, 'd.h. da wird alles was im EMpfangsbuffer anliegt ausgelesen und ausgegeben. -> brauche im Event vom Button klick nicht definieren 'da arduino nur sendet wenn er Dollarzeichen erhält, also -> receive, da kommt erst eventhandler datarecieved zum arbeiten
    2. Me.Invoke(Sub() RichTextBox1.Text = inputdata
    3. End Sub)End Sub

    OneWorld schrieb:

    Das darfst du natürlich nicht erneut senden. Das sendest du als erstes und anschließend sendest du deine anderen Sachen. Ich weiß natürlich jetzt nicht, wie die gesamte stelle aussieht. Bitte ggf. mal posten ;)

    Gruß

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

    Ob du den schließen musst und anschließend wieder öffnen musst, kann ich nicht sagen, da ich bis jetzt auch nur ein oder zwei mal mit dem SerialPort gearbeitet habe. Zu dem $:

    Verstehe ich das richtig, dass du also nun 2 Buttons hast. Einen für das Senden der Parameter und den anderen zum Empfangen von Daten ?
    Youtube Info Library 2013 jetzt im Showroom.
    Hab das Problem nicht beseitigen können, hat jemand eine Lösung?
    Dieses ? wird von meiner GUI abgesendet, wenn ich den Button i2c_scan betätige. Darauf soll der Arduino den I2c-bus scannen und die Resultate an die GUI per Serial senden.

    Jetzt die Frage, habe bemerkt, dass ich nach dem Senden des ? den Port nicht schliesse, könnte das es sein?
    Doch wenn ich Ihn schliesse, dann empfange ich nichts oder?

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_scani2c.Click
    2. If Not SerialPort_i2c.IsOpen = True Then
    3. SerialPort_i2c.Open()
    4. End If
    5. SerialPort_i2c.Write(kontrol_scan)


    Über Tipps wüerde ich mich freuen.

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

    Hallo nochmal und zwar hab immer noch das Problem und zwar:

    ich soll anhand einer GUI beim Betätigen des Senden button Parameter an dem Arduino senden.

    Damit der Arduino weiß, dass er Daten von der GUI empfängt, sende ich beim Drücken des Sendenbutton ein KOntrollzeichen mit, d.h. sende ein "-" und hintendran meine Parameter.

    Jetzt habe ich das Problem, dass er das ontrollzeichen ab und an mit speichert z.b.-> -2;3;4., manchmal habe ich auch folgende ausgabe: ---2,3,4
    Das problem ist es tritt nicht immer auf :(. Kann mir mittlerweile auch nicht mehr erklären was das sein kann.
    Kann mir jemand vllt helfen?

    Hier nochmal mein code:

    VB.NET-Quellcode

    1. Private Sub Button1_Click_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_single_i2c.Click
    2. Try
    3. If Not SerialPort_i2c.IsOpen = True Then
    4. SerialPort_i2c.Open()
    5. End If
    6. SerialPort_i2c.Write("-")
    7. SerialPort_i2c.Write(list_choice_i2c.SelectedItem)
    8. SerialPort_i2c.Close()
    9. Catch ex As Exception
    10. End Try