Mehrere Werte über Serielle Schnittstelle an Arduino ausgeben

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von ebrithil.

    nee keine sorge, man lernt nie aus, ich sehe es nicht als kritik.
    D.h. er weiß nicht, ob er lesen oder schrieben muss?
    Durch das mit dem "$" ist es sauberer abgetrennt, meinst du das?


    wie sollte ich den Text auswerten? _> sorry für die frage
    Hmm jetzt geht nichts mehr, habe es mit dem $ versucht immer noh nichts.

    Man ich sehe den Wald vor lauter bäume nicht mehr :(.

    Hier mein Arduino Code:

    C-Quellcode

    1. /*Code zum Empfangen und Senden von Daten über Serialport (GUI<-> Arduino) */
    2. //Globale Variablen
    3. /*----------Varaiblen fürs Senden---------------------------------------*/
    4. const int ledPin1= 22; //Mit Digital PIN 22 verbundene Led (senden)
    5. /*----------------------------------------------------------------------*/
    6. /*----------------SD Karte----------------------------------------------*/
    7. /* Verbindung - SPI Mega2560
    8. ** MISO - pin 51
    9. **MOSI - pin 50
    10. **CLK - pin 52
    11. **CS- PIN 53
    12. !! somit pin 53 als output auch fstlegen*/
    13. #include <SD.h>
    14. int const chipSelect=53; //CS-Pin
    15. char inText[300];//Char array
    16. int index; //index für Array
    17. char txtByte; //Variable zum speichern
    18. File Datei;
    19. /*----------Variablen fürs Empfangen------------------------------------*/
    20. const int ledPin2= 23; //MIt Digital PIN 23 verbundene Led (empfangen)
    21. /*----------------------------------------------------------------------*/
    22. /*-----------Auswahlvariable für Swtich-Case----------------------------*/
    23. int inByte; //Integervariable für Case-Verfahren
    24. /*----------------------------------------------------------------------*/
    25. /*----------- Hier beginnt das Programm---------------------------------*/
    26. void setup()
    27. {
    28. Serial.begin(9600); //Serialport öffnen mit baudrate 9600
    29. pinMode(ledPin1, OUTPUT); //ledPin1(senden LED), wird als Output gesetzt
    30. pinMode(ledPin2, OUTPUT); //ledPin2 (empf. LED), wird als Output gesetzt
    31. pinMode(53,OUTPUT);
    32. }
    33. void loop()
    34. {
    35. if (Serial.available()>0) //Prüfen , ob mindestens ein Zeichen im Port vorhanden ist (Hier prüfe ich , ob senden oder EMpfangen)
    36. {
    37. inByte = Serial.read(); //lese zeichen au und speichere in chr vom typ char
    38. //wahl = int(chr); //Umwandeln in lesbares
    39. }
    40. /*+++++++++++++++++++++++++LED-Rot-> Arduino Sendet+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    41. if (inByte == 36) //$ in ASCII
    42. {
    43. blink_send();
    44. //Aufruf der Funktion zum Auslesen der SD karte
    45. SD_read();
    46. }//endif
    47. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    48. /*++++++++++++++++++++++++++++++++++++Arduino empfängt+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    49. else
    50. {
    51. blink_receive();
    52. if (Serial.available() > 0)
    53. {
    54. txtByte = Serial.read();
    55. if (txtByte == 13) //Enter kommt
    56. {
    57. Serial.print("SD Card Initializing.....");
    58. if (! SD.begin(chipSelect))
    59. {
    60. Serial.println("Initialization failed");
    61. return;
    62. }//endNif initialize
    63. Serial.print("Card initialized.");
    64. Datei = SD.open("commands.txt",FILE_WRITE);
    65. Datei.print(inText);
    66. if (!Datei)
    67. {
    68. Serial.println("Error to open commands.txt");
    69. }//endif error
    70. //Nach verarbeitung muss array wieder initialisiert werden
    71. index=0;
    72. memset(&inText[0], 0, sizeof(inText));
    73. } //endif enter
    74. else
    75. {
    76. if (index <300)
    77. {
    78. inText[index] = txtByte; //trage inhalt von Variable txtbyte in inTextArray
    79. index +=1;
    80. }//endif indexüberprüfung
    81. } //else end
    82. }//end if serial available
    83. }//endif falls kein "$" kommt
    84. }//end void loop
    85. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
    86. /*---------------------funktion für das Blinken beim senden an GUI----------------------*/
    87. /*---------------------Blink funktion 0,5sek an und 0,5sek aus--------------------------*/
    88. /*Rote LED*/
    89. void blink_send()
    90. {
    91. digitalWrite(ledPin1, HIGH); //leuchtet
    92. delay(500); //leuchtet 0,5 sek
    93. digitalWrite(ledPin1, LOW); //aus
    94. delay(500);
    95. }
    96. /*-------------------------------------------------------------------------------------*/
    97. /*----------Funktion die in Case 2 aufegrufen wird, damit LED blinkt-------------------*/
    98. /*gelbe LED*/
    99. void blink_receive()
    100. {
    101. digitalWrite(ledPin2, HIGH); //leuchtet
    102. delay(500); // 0,5sek an
    103. digitalWrite(ledPin2,LOW); //aus
    104. delay(500); //0,5sek aus
    105. }
    106. /*-------------------------------------------------------------------------------------*/
    107. void led_off(){
    108. digitalWrite(ledPin1,LOW);
    109. digitalWrite(ledPin2,LOW);
    110. }
    111. void SD_read()
    112. {
    113. Serial.print("SD Card Initializing......");
    114. Serial.write(13); //enter
    115. if (!SD.begin(chipSelect))
    116. {
    117. Serial.println("Initialization failed, card not present");
    118. return; //tue nichts
    119. }//endif prüfe ob SD karte da ist
    120. Serial.println("Card was detected");
    121. Datei= SD.open("COMMANDS.txt");
    122. //wenn file vorhanden
    123. if(Datei)
    124. {
    125. while (Datei.available())
    126. {
    127. Serial.write(Datei.read());
    128. }//end while
    129. Datei.close();
    130. }//end if
    131. else
    132. {
    133. Serial.print("error opening commands.txt");
    134. }//end else
    135. }//end func




    Hier mein VB - Code:

    Brainfuck-Quellcode

    1. Dim inputdata As String
    2. Dim kontrol_receive As Integer = 1 'kontrolvariable für Empfangen von Arduino
    3. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_i2c_receive.Click
    4. RichTextBox1.ForeColor = Color.Black
    5. '/------Kontrollvariale an Arduino =1 , somit weiß er das er an GUI senden soll---/
    6. If Not SerialPort_i2c.IsOpen = True Then
    7. SerialPort_i2c.Open()
    8. End If
    9. SerialPort_i2c.Write(Chr(kontrol_receive)) 'muss in char gekcastet werden ,da arduino diesen in byte umwandelt
    10. 'SerialPort_i2c.Write(kontrol_receive)
    11. '---------------------------------------------------------------------------------/
    12. '/---------Der von dem EventHandler in die Variable gesetzte Text wird an die RTB angehängt------/
    13. RichTextBox1.Text = inputdata
    14. '/-----------------------------------------------------------------------------------------------/
    15. 'If Cmbport_i2c.Text = "" Then
    16. 'MsgBox("Please select COM-Port to read from Arduino ")
    17. 'End If
    18. End Sub
    19. Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort_i2c.DataReceived
    20. 'das was an buffer ist wird an variable drangehängt und somit nicht ueberschrieben
    21. inputdata = inputdata & SerialPort_i2c.ReadExisting
    22. End Sub
    23. Private Sub btn_i2c_clear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_i2c_clear.Click
    24. RichTextBox1.Clear() 'reinige richtextbox
    25. End Sub
    26. Private Sub btn_exit_i2c_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_exit_i2c.Click
    27. Me.Close() ' Me weil das das eigene fesnter ist'
    28. 'Application.Exit() geht auch'
    29. End Sub
    30. Dim kontrol_sende As Integer = 2 'kontrolvariable für Senden an Arduino
    31. Private Sub btn_i2c_send_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_i2c_send.Click
    32. 'Mit try wird versucht Übertragung an Arduino durchzuführen'
    33. Try
    34. 'öffne Serielle Anschlussverbindung, sofern nicht bereits geöffnet'
    35. If Not SerialPort_i2c.IsOpen Then SerialPort_i2c.Open()
    36. SerialPort_i2c.Write(Chr(kontrol_sende))
    37. 'SerialPort_i2c.Write(kontrol_sende)
    38. 'falls Verbindung zum Device besteht, doch es wird auf sendbutton gedrückt und leere Texbox, meldung + verbindung schliessen
    39. If txtbox_i2c.Text = "" Or Cmbport_i2c.Text = "" Then
    40. 'If Cmbport_i2c.Text = "" Then
    41. SerialPort_i2c.Close()
    42. MsgBox("Please check if you select the COM-Port" & vbCrLf & " Please check the input of the command")
    43. Else 'sonst Schreibe / sende Ínhalt der Textbox an Arduino'
    44. 'SerialPort_i2c.Write("Hallo inter")
    45. SerialPort_i2c.Write(txtbox_i2c.Text) ' durch vbr = Enter, d.h. wenn ein ganzer String wird ein enter gesendet und arduino weiß ok gsnzer String
    46. 'SerialPort_i2c.Write(vbCrLf)
    47. MsgBox("Transfer successful")
    48. End If
    49. 'Falls Übertragung fehlschlägt, Catch block um fehler auszubügeln und eigene message von vb'
    50. Catch ex As Exception
    51. MsgBox("Transfer failed - Please check the connection" & vbCrLf & ex.Message)
    52. End Try
    53. 'Nach Übertragung Port wieder freistellen'
    54. If SerialPort_i2c.IsOpen = True Then
    55. SerialPort_i2c.Close()
    56. End If
    57. End Sub


    Schau bitte mal drüber, ich ob was falsch ist.

    Danke dir und tut mir leid für das ständige fragen

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

    Hi, also ich habe keine lust deinen Code zu überarbeiten, wenn ich dich wäre würde ich komplett von vorne anfangen und bevor du beginnst zu programmieren dir auf n Zettel dein Protokoll aufschreibst.
    Mit Protokoll meine ich in was für eine Art du deine Daten an den Arduino senden willst, und danach siehst du dir mein Tutorial an unter Erweiterte Kommunikation


    mfg Ebrithil
    Mein Erstes Tutorial: Erweitertes Arduino Tutorial

    Simpler D&D FTP Uploader: Edge-Load
    HI danke dir hab es jetzt hinbekommen, hab dein Vorschlag angenommen und das mit dem $ programmiert.
    EIne kleinigkeit wäre noch, wenn ich bei meiner GUI den Receive button drücke, damit der Arduino di Daten von der Sd karte liest und er sie der GUI sendet via Serialport, möchte ich diese anzeigen. Das geht soweit, nur mit verzögerung, d.h. ich muss 2-3 mal auf dem recieve button drücken, damit ich den kompletten inhalt sehe.
    Habe auch einen Delay in dem Arduino code einprogrammiert, aber wirklich besser ist es nicht geworden.

    Kennst du die Ursache?