Anhand von Recieve Button Daten von Arduino empfangen

  • VB.NET

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

    Anhand von Recieve Button Daten von Arduino empfangen

    Hallo möchte mit meinem Arduino Mega2560 folgendes realisieren:



    möchte sowohl per button click Daten an Arduino senden und auch empfangen via SerialPort.

    Das senden funktioniert soweit gut, doch das Empfangen der Daten vom Arduino zur GUI (Anzeige der empfangen Daten in Textbox) funktioniert nicht.

    Habe mir auch das Tutorial dazu auf der Seite angesehn doch bekomme es nicht hin.


    Habe es folgendermaßen programmiert:

    Quellcode

    1. Dim SP_Empfangen As String
    2. Dim inByte As String
    3. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_i2c_receive.Click
    4. Try
    5. If Cmbport_i2c.Text = "" Then
    6. MsgBox("Please select a COM-Port")
    7. SerialPort_i2c.Close()
    8. Else
    9. SerialPort_i2c.PortName = Cmbport_i2c.Text
    10. SerialPort_i2c.Open()
    11. SerialPort_i2c.ReadTimeout = 1000
    12. End If
    13. Dim ToRead As Integer = SerialPort_i2c.BytesToRead
    14. If ToRead > 0 Then
    15. Dim Buffer(ToRead - 1) As Byte
    16. SerialPort_i2c.Read(Buffer, 0, ToRead)
    17. If inByte = vbCr Then
    18. SP_Empfangen = Nothing
    19. Else
    20. SP_Empfangen = inByte
    21. txtbox_i2c_receive.Text = SP_Empfangen
    22. End If
    23. End If
    24. Catch ex As Exception
    25. MsgBox("Error")
    26. End Try
    27. End sub


    ALso bekomme nichts also Ausgabe.

    Mir ist eswichtig, dass ich die Daten vom Arduino in die Gui per Button klick empfange.

    Bitte um hilfe. sitze da schon seit einigen Stunden und komme nicht weiter.



    Danke
    Willkommen im Forum. :thumbup:
    Das SerialPort hat ein DataReceived-Event, nutze es, um Daten vom Port abzuholen.
    Da das Port in einem anderen Thread arbeitet als die GUI, benötigen wir ein Invoke(), um die Daten in den GUI-Thread zur Anzeige bringen zu können.

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Me.Invoke(Sub() ReceiveText())
    3. End Sub
    4. Private Sub ReceiveText()
    5. Dim ToRead As Integer = SerialPort1.BytesToRead
    6. If ToRead > 0 Then
    7. 'Neu empfangene Zeichen an die Empfangspuffer anhängen
    8. Dim Buffer(ToRead - 1) As Byte
    9. SerialPort1.Read(Buffer, 0, ToRead)
    10. TextBox1.Text &= System.Text.Encoding.Default.GetString(Buffer)
    11. End If
    12. End Sub
    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!
    HI ok, nun habe ich das Problem, dass ich Daten von der GUI dem Arduino per Sende button übertragen möchte und dieser das Empfangene in die txt.datei auf der Sd karte schreibt, doch der inhalt bleibt leer.

    Bräuchte dringend hilfe:(

    Arduino :

    Brainfuck-Quellcode

    1. int ist_senden= 1; //Falls Arduino an GUI sendet
    2. const int ledPin1= 22; //Mit Digital PIN 22 verbundene Led (senden)
    3. /*----------------------------------------------------------------------*/
    4. /*----------Variablen fürs Empfangen------------------------------------*/
    5. const int ledPin2= 23; //MIt Digital PIN 23 verbundene Led (empfangen)
    6. int ist_receive=2; //Falls Arduino von GUI empfangen soll
    7. //Variable wo das Empfangene abgespeichert wird(als Byte)
    8. /*----------------------------------------------------------------------*/
    9. /*-----------Auswahlvariable für Swtich-Case----------------------------*/
    10. int inByte; //Integervariable für Case-Verfahren
    11. /*----------------------------------------------------------------------*/
    12. /*----------- Hier beginnt das Programm---------------------------------*/
    13. void setup()
    14. {
    15. Serial.begin(9600); //Serialport öffnen mit baudrate 9600
    16. pinMode(ledPin1, OUTPUT); //ledPin1(senden LED), wird als Output gesetzt
    17. pinMode(ledPin2, OUTPUT); //ledPin2 (empf. LED), wird als Output gesetzt
    18. }
    19. Hier ist mein Arduino Part:
    20. void loop()
    21. {
    22. led_off();
    23. if (Serial.available()>0) //Prüfen , ob mindestens ein Zeichen im Port vorhanden ist (Hier prüfe ich , ob senden oder EMpfangen)
    24. {
    25. inByte = Serial.read(); //lese zeichen au und speichere in chr vom typ char
    26. //wahl = int(chr); //Umwandeln in lesbares
    27. }
    28. //LED-Rot-> sendet an GUI (Transmit)
    29. if (inByte == 1)
    30. {
    31. blink_send();
    32. Serial.write("Hallo, ich bin dein Arduino");
    33. Serial.write(13); //Carrige return line feed muss vom arduino kommen damit an gui richtig dargestellt wird
    34. blink_send();
    35. delay(2500);
    36. Serial.write("Ich habe vor genau 2,5 Sekunden Hallo gesagt :)");
    37. Serial.write(13);
    38. blink_send();
    39. Serial.write("Jetzt geht's von vorne los...");
    40. Serial.write(13);
    41. }
    42. //LED-Gelb -> empfängt von GUI (Receive)
    43. if (inByte == 2)
    44. {
    45. blink_receive();
    46. }
    47. }
    48. /*---------------------funktion für das Blinken beim senden an GUI----------------------*/
    49. /*---------------------Blink funktion 0,5sek an und 0,5sek aus--------------------------*/
    50. /*Rote LED*/
    51. void blink_send()
    52. {
    53. digitalWrite(ledPin1, HIGH); //leuchtet
    54. delay(500); //leuchtet 0,5 sek
    55. digitalWrite(ledPin1, LOW); //aus
    56. delay(500);
    57. }
    58. /*-------------------------------------------------------------------------------------*/
    59. /*----------Funktion die in Case 2 aufegrufen wird, damit LED blinkt-------------------*/
    60. /*gelbe LED*/
    61. void blink_receive()
    62. {
    63. digitalWrite(ledPin2, HIGH); //leuchtet
    64. delay(500); // 0,5sek an
    65. digitalWrite(ledPin2,LOW); //aus
    66. delay(500); //0,5sek aus
    67. }
    68. /*-------------------------------------------------------------------------------------*/
    69. void led_off(){
    70. digitalWrite(ledPin1,LOW);
    71. digitalWrite(ledPin2,LOW);
    72. }



    Mein Arduino Part :






    VB2010:

    Dim kontrol_sende As Integer = 2 'kontrolvariable für Senden an Arduino


    Private Sub btn_i2c_send_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_i2c_send.Click
    'Mit try wird versucht Übertragung an Arduino durchzuführen'
    Try


    'öffne Serielle Anschlussverbindung, sofern nicht bereits geöffnet'
    If Not SerialPort_i2c.IsOpen Then SerialPort_i2c.Open()


    SerialPort_i2c.Write(Chr(kontrol_sende))
    'SerialPort_i2c.Write(kontrol_sende)


    'falls Verbindung zum Device besteht, doch es wird auf sendbutton gedrückt und leere Texbox, meldung + verbindung schliessen
    If txtbox_i2c.Text = "" Or Cmbport_i2c.Text = "" Then


    SerialPort_i2c.Close()
    MsgBox("Please check if you select the COM-Port" & vbCrLf & " Please check the input of the command")


    Else 'sonst Schreibe / sende Ínhalt der Textbox an Arduino'
    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
    SerialPort_i2c.Write(13)
    MsgBox("Transfer successful")
    End If


    'Falls Übertragung fehlschlägt, Catch block um fehler auszubügeln und eigene message von vb'
    Catch ex As Exception
    MsgBox("Transfer failed - Please check the connection" & vbCrLf & ex.Message)
    End Try


    'Nach Übertragung Port wieder freistellen'


    If SerialPort_i2c.IsOpen = True Then
    SerialPort_i2c.Close()
    End If


    End Sub






    Brauche eure hilfe

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

    Hi danke für deine Antwort :D.

    Habe mir das angeschaut, das problem ist es funktioniert nicht.

    ich bekomme es nicht hin, den über serialport gesenden string auf die die sd karte in dem txt.file zu schrieben.

    wäre es vllt. möglich über meinen code den ich gepostest habe zu schauen, wo der fehler liegt. Hab mich zu tode gesucht und hab den fehler immer noch nicht.

    Wäre echt toll.
    Hey

    Quellcode

    1. Int inByte;
    2. Char inText[300];
    3. Int index;
    4. void setup() {
    5. Serial.begin(9600);
    6. }
    7. if (Serial.available() > 0) {
    8. inByte = Serial.read();
    9. if (inByte == 13) // Wenn das Enter ankommt
    10. {
    11. // Hier kann alles Mögliche stehen, der vor dem Enter gesendete Text steht im inText Array
    12. // Nach der Verarbeitung des Textes muss der Index auf 0 gesetzt werden und das Array gelöscht
    13. index = 0;
    14. memset(&inText[0], 0, sizeof(inText));
    15. }
    16. else // Falls kein Enter kommt muss der Text gespeichert werden in dem inText Array
    17. {
    18. if (index < 300) { // Diese Überprüfung ist nötig, damit das Array nicht überfüllt wird sonst werden andere Variablen überschrieben.
    19. inText[index] = inByte;
    20. index += 1;
    21. }
    22. }


    Wenn du den Bereich ansiehst zwischen:

    Quellcode

    1. if (inByte == 13) // Wenn das Enter ankommt
    2. {
    3. // Hier kann alles Mögliche stehen, der vor dem Enter gesendete Text steht im inText Array


    Und

    Quellcode

    1. // Nach der Verarbeitung des Textes muss der Index auf 0 gesetzt werden und das Array gelöscht
    2. index = 0;
    3. memset(&inText[0], 0, sizeof(inText));


    Kannst du dann hinschreiben:

    Quellcode

    1. file.write(inText);


    Musst hald vorhin das SD-Shield deklarieren, plus die gewünschte Datei mit Schreibberechtigung öffnen. Danach kannst du in diesem Abschnitt in die Datei schreiben.



    mfg Ebrithil
    Mein Erstes Tutorial: Erweitertes Arduino Tutorial

    Simpler D&D FTP Uploader: Edge-Load
    sorry der obere Arduino code ist der falsche,

    das ist der richtige, schau mal, da habe ich es deklariert und es so mit dem schrieben gemacht wie beschrieben , bekomme trotzdem immer noch die komischen zeichen als ausgeb und als eintrag in der Sd karte:



    Arduino Code:



    /*Code zum Empfangen und Senden von Daten über Serialport (GUI<-> Arduino) */
    /*Die Daten werden in eine SD-Karte innerhalb von commands.txt abgespeichert*/


    //Globale Variablen
    /*----------Varaiblen fürs Senden---------------------------------------*/
    int ist_senden= 1; //Falls Arduino an GUI sendet
    const int ledPin1= 22; //Mit Digital PIN 22 verbundene Led (senden)-(rote led)
    /*----------------------------------------------------------------------*/

    /*#define BUFSIZE 80
    byte pos= 0;
    char buffer[BUFSIZE]; */
    char inText[300];
    int index;
    int Byte;


    /*----------Variablen fürs Empfangen------------------------------------*/
    const int ledPin2= 23; /*MIt Digital PIN 23 verbundene Led (empfangen)-(gelbe led) */
    int ist_receive=2; //Falls Arduino von GUI empfangen soll


    /*-----------SD Card-----------------------------------------------------*/
    /* Verbindung - SPI an Mega2560
    **MISO - pin 51
    **MOSI - pin 50
    **CLK - pin 52
    **SS/CS (Chipselect) - pin 4 -> Standard chipselect pin 53
    !!-----pin 53 somit als OUTPUT legen , da nicht verwendet-----*/

    #include <SD.h>
    int const chipSelect=53; //pin 4 für CS/SS-pin
    String dataString; //Variable zum SpeiSern von Serialport-Daten
    File Datei; //um file zu öffnen bzw. auch zu

    /*----------------------------------------------------------------------*/
    /*-----------Auswahlvariable für Swtich-Case----------------------------*/
    int inByte=0; //Variable wo das Empfangene kontrollbit abgespeichert wird(als Byte)
    /*----------------------------------------------------------------------*/

    //*----------- Hier beginnt das Programm---------------------------------*//

    //*------Standard einstellung, die konstant sind in void setup()---------*//

    void setup()
    {
    Serial.begin(9600); //Serialport öffnen mit baudrate 9600
    //pinMode(ledPin1, OUTPUT); //ledPin1(senden LED), wird als Output gesetzt
    //pinMode(ledPin2, OUTPUT); //ledPin2 (empf. LED), wird als Output gesetzt

    pinMode(53, OUTPUT); //da standard-Pin CS/SS nicht verwendet diesen als OUTPUT legen

    }
    /*------------------------------------------------------------------------*/


    /*-------Diese Funktionen werden ständig abgefragt in loop----------------*/
    void loop()
    {
    if (Serial.available() > 0) //Prüfen , ob mindestens ein Zeichen im Port vorhanden ist (Hier prüfe ich , ob senden oder EMpfangen)
    {
    inByte = Serial.read(); //lese zeichen au und speichere in chr vom typ char


    switch (inByte)
    {

    /*Senden der Daten von Arduino zur GUI*/
    case 1:

    blink_send();
    //Aufruf der Funktion zum auslesen von SD
    read_SD();



    break; //beende case 1

    /* Von GUI empfangen*/
    case 2:

    if (Serial.available()>0)
    {
    Byte=Serial.read();
    if (inByte ==13)
    Serial.print("Initializing SD Card.....");

    if(!SD.begin(chipSelect)){
    Serial.println("Initialization failed, card not present!");
    return;
    }
    Serial.println("card initialized.");
    Datei= SD.open("commands.txt", FILE_WRITE);
    if (!Datei){
    Serial.println("Error to open commands.txt");
    }

    Datei.write(inText); //Schreibe inhalt in SD-Karte
    Datei.close(); //Schliessen damit daten in SD gespeichert werden

    index=0;
    memset(&inText[0], 0, sizeof(inText));
    }//endif 1

    else
    if (index < 300)
    {
    inText[index]= inByte;
    index += 1;

    }//endif2
    //end if (big)
    //write_SD(inText);
    blink_receive();

    break; //end switch case2

    }//end switch
    } //end fu
    }
    //############################################################################################################################################################//
    //++++++++++++++++++++++++++++++++++++Funktionenbereich: Alle Funktionen, die innerhalb des Programms aufgerufen werden+++++++++++++++++++++++++++++++++++++++//
    //############################################################################################################################################################//

    /*---------------------funktion für das Blinken beim senden an GUI----------------------*/
    /*---------------------Blink funktion 0,5sek an und 0,5sek aus--------------------------*/


    /*Rote LED*/

    void blink_send()
    {

    digitalWrite(ledPin1, HIGH); //leuchtet
    delay(500); //leuchtet 0,5 sek
    digitalWrite(ledPin1, LOW); //aus
    delay(500);

    }
    /*-------------------------------------------------------------------------------------*/


    /*----------Funktion die in Case 2 aufegrufen wird, damit LED blinkt-------------------*/

    /*gelbe LED*/

    void blink_receive()
    {
    digitalWrite(ledPin2, HIGH); //leuchtet
    delay(500); // 0,5sek an
    digitalWrite(ledPin2,LOW); //aus
    delay(500); //0,5sek aus

    }

    /*-------------------------------------------------------------------------------------*/




    //------------------------------------Funktion zum Auslesen der SD-Card-------------------------------------//
    void read_SD(){
    Serial.print("Initializing SD Card.......");
    Serial.write(13); //Carriage_Return Line feed
    /*if (card.init(SPI_HALF_SPEED, chipSelect)){
    Serial.println("SD Card detected");
    }
    else{
    Serial.println(" No SD Card detected ");
    }
    delay(1000); */
    if (!SD.begin(chipSelect)){
    Serial.println("Initialization failed, card not present!");
    return; //tue nichts

    }
    Serial.println("Card was detected");
    //Öffne Datei commands.txt
    Datei=SD.open("COMMANDS.txt");

    //wenn File/Datei vorhanden
    if(Datei){
    //lese solange file aus bis nichts mehr zu lesen ist
    while (Datei.available()){
    Serial.write(Datei.read()); //Schreibe an port Inhalt , das von Sd ausgelesne wird
    //delay(500);
    }

    //Nach lesen Datei schliessen
    Datei.close();
    }
    else
    //falls Datei nicht geöfnet werden konnte
    Serial.println("error opening commands.txt");
    Serial.write(13); //Carriage return line feed
    Serial.print("It is not possible to read out the file");

    //Serial.print("Testausgabe :"); Serial.println(inByte);

    }
    //-------------------------------------------------------------------------------------------------------//


    Das ist der richtige code, habe alle eure tipps befolgt, aber geht nicht :(.



    Hier mein VB:code


    Dim inputdata As String
    Dim kontrol_receive As Integer = 1 'kontrolvariable für Empfangen von Arduino


    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_i2c_receive.Click
    RichTextBox1.ForeColor = Color.Black


    '/------Kontrollvariale an Arduino =1 , somit weiß er das er an GUI senden soll---/
    If Not SerialPort_i2c.IsOpen = True Then
    SerialPort_i2c.Open()

    End If

    SerialPort_i2c.Write(Chr(kontrol_receive)) 'muss in char gekcastet werden ,da arduino diesen in byte umwandelt
    'SerialPort_i2c.Write(kontrol_receive)

    '---------------------------------------------------------------------------------/

    '/---------Der von dem EventHandler in die Variable gesetzte Text wird an die RTB angehängt------/
    RichTextBox1.Text = inputdata
    '/-----------------------------------------------------------------------------------------------/


    'If Cmbport_i2c.Text = "" Then
    'MsgBox("Please select COM-Port to read from Arduino ")
    'End If

    End Sub

    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 ueberschrieben
    inputdata = inputdata & SerialPort_i2c.ReadExisting

    End Sub

    Private Sub btn_i2c_clear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_i2c_clear.Click
    RichTextBox1.Clear() 'reinige richtextbox

    End Sub

    Private Sub btn_exit_i2c_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_exit_i2c.Click
    Me.Close() ' Me weil das das eigene fesnter ist'
    'Application.Exit() geht auch'

    End Sub

    Dim kontrol_sende As Integer = 2 'kontrolvariable für Senden an Arduino

    Private Sub btn_i2c_send_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_i2c_send.Click
    'Mit try wird versucht Übertragung an Arduino durchzuführen'
    Try

    'öffne Serielle Anschlussverbindung, sofern nicht bereits geöffnet'
    If Not SerialPort_i2c.IsOpen Then SerialPort_i2c.Open()

    SerialPort_i2c.Write(Chr(kontrol_sende))
    'SerialPort_i2c.Write(kontrol_sende)

    'falls Verbindung zum Device besteht, doch es wird auf sendbutton gedrückt und leere Texbox, meldung + verbindung schliessen

    'If txtbox_i2c.Text = "" Or Cmbport_i2c.Text = "" Then
    If Cmbport_i2c.Text = "" Then

    SerialPort_i2c.Close()
    MsgBox("Please check if you select the COM-Port" & vbCrLf & " Please check the input of the command")

    Else 'sonst Schreibe / sende Ínhalt der Textbox an Arduino'

    SerialPort_i2c.Write("Hallo inter")
    '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
    SerialPort_i2c.Write(vbCrLf)
    MsgBox("Transfer successful")
    End If

    'Falls Übertragung fehlschlägt, Catch block um fehler auszubügeln und eigene message von vb'
    Catch ex As Exception
    MsgBox("Transfer failed - Please check the connection" & vbCrLf & ex.Message)
    End Try

    'Nach Übertragung Port wieder freistellen'

    If SerialPort_i2c.IsOpen = True Then
    SerialPort_i2c.Close()
    End If

    End Sub

    Private Sub txtbox_i2c_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtbox_i2c.TextChanged

    End Sub

    Private Sub btn_stop_i2c_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_stop_i2c.Click
    If SerialPort_i2c.IsOpen Then
    SerialPort_i2c.Close()
    End If
    End Sub

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