Über VB-GUI daten an Arduino senden und diese in SD karte speichern

  • VB.NET

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von gfcwfzkm.

    Über VB-GUI daten an Arduino senden und diese in SD karte speichern

    Hallo an alle,

    habe mir mit VB2010 eine GUI gebastelt, die steuerparmeter an dem Arduino sendet über einen Button send via Serialport.
    Die GUI kann auch vom Arduino die Steuerparameter an der GUI senden und dies passiert anhand des buttons receive.

    Habe folgendes problem:

    Ich möchte die gesendeten parameter , die der Arduino über Serial empfängt in die SD karte in einer txt.Datei schreiben und nach bedarf(wenn ich in meiner GUI receive drücke) den Inhalt von der txt.datei in der Sd auslesen und der GUI übergeben.

    DOCH habe vergebens auch in dem Arduino forum gefragt und selbst prboiert und auch das tutorial von hier ausprobiert, aber die Daten werden einfach nicht in die SD karte geschrieben.

    Bräuchte dringend eure Unterstützung.

    Hier der Arduino code:


    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 1 mal editiert, zuletzt von „milito“ ()

    Quellcode

    1. int inByte; //Integervariable für Case-Verfahren

    Case? Wo benutzt du in deinem Code Case?

    Quellcode

    1. //Variable wo das Empfangene abgespeichert wird(als Byte)

    Welche Variable soll das sein etwa --> wahl?

    Quellcode

    1. inByte = Serial.read(); //lese zeichen au und speichere in chr vom typ char
    2. //wahl = int(chr); //Umwandeln in lesbares

    Variable chr? Ist wo?
    Und wenn chr vom Typ Char sein soll wieso willst du aus Text Zahlen machen? Also lesbar --> unlesbar?

    Und wo speicherst du nun etwas auf der SD Karte deines Arduinos ab?
    So kann dir hier glaube ich keiner helfen...

    mfg
    Danke euch hab es hinbekommen .
    Jetzt habe ich nur noch ne frage und zwar: ich sende über die GUI jeweils 3 befehle aus. So d.h. ein befehl pro textbox.
    z.b. Txtbox1 = hallo
    Txtbox2= hi
    txtbox3 = go

    so in der txtdatei auf der Sd werden sie folgendermaßen abgelegt:hallohigo
    so jetzt wollte ich diese jeweils mit einem Semikolon abtrennen und zwar folgendermaßen: hallo;hi;go
    das möchte ich von der gui schon so einstellen habe es versucht, doch es klappt nicht.
    Das war ein versuch von mir:

    Quellcode

    1. SerialPort_i2c.Write(txtbox_slaveadr_i2c.Text & ";" & txtregister_i2c.Text & ";" & txtbox_i2c.Text)



    ud habe folgende ausgabe:
    ;hallo;hi;go; -> mich stört der anfangssemikolon und der zum schluss


    Hätte da jemand eine Idee?
    Offensichtlich ist txtbox_slaveadr_i2c.Text empty.
    Trenne GUI und Daten, bau den zu übertragenden String separat auf und füge nur dann ein Semikolon an, wenn der nachfolgende String nicht leer ist.
    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!
    Kann es sein, dass diese Bedingung erfüllt ist?

    VB.NET-Quellcode

    1. If txtbox_slaveadr_i2c.Text.StartsWith(";") Then
    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 diesen Befehl kenn ich nicht :D.
    D.h. ich kann sozusagen mit diesem Befehl aussortieren?
    Habe es folgendermaßen gemacht:

    Quellcode

    1. SerialPort_i2c.Write(txtbox_slaveadr_i2c.Text & ";") '; damit in csv datei in spalten
    2. SerialPort_i2c.Write(txtregister_i2c.Text & ";") 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(vbCr) MsgBox("Transfer successful")



    Also habe gedacht, dass ich immer ein ; sende mit dem String an dem Arduino und diese anstatt in einer txt.datei in eine csv datei spechere, somit würde excel diese automatisch anhand des ; in spalten sortieren.

    Was hältst du davon?
    Gibt es die möglichkeit irgendwie die inhalt auszulesen ohne ;?
    Bzw der Befehl von dir wozu ist er?

    milito schrieb:

    Habe es folgendermaßen gemacht:
    Nicht gut.
    Wir wollen Daten und GUI trennen, hier bedeutet das, dass im Send-Befehl keine String-Arithmetik stattfindet, sondern dass Du den zu sendenden String zunächst in einer Variable ablegst und die dann sendest.
    Dies macht sich gut bei der Fehlersuche.

    milito schrieb:

    Bzw der Befehl von dir wozu ist er?
    If text.StartsWith("xx") Then ==> Wenn text beginnt mit "xx" tue dies: :rolleyes:
    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 sorry , aber wie meinst du das Daten von der GUI trennen bzw keine String - Aritmethik?
    Bzw wie meinst du das in Variable ablegen? -> den inhalt der textbox von der GUI-Seite in Variable ablegen und dann die Variable (mit dem Inhalt) per Serialport senden , oder wie ist das gemeint? -> Sorry stehe auf dem schlauch :(
    Stringarithmetik ist z.B. die Verwendung des &-Operators in einem Funktionsargument.
    Mach aus

    milito schrieb:

    VB.NET-Quellcode

    1. SerialPort_i2c.Write(txtbox_slaveadr_i2c.Text & ";")
    so was:

    VB.NET-Quellcode

    1. Dim textToSend = txtbox_slaveadr_i2c.Text & ";"
    2. SerialPort_i2c.Write(textToSend)
    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, d.h. wenn ich speichere den String mit dem ; in eine Varaible und sende diese ab , da man die fehler besser erkennen kann :D.
    So jetzt folgendes , dass sind ja Steuerparameter um ein i2c-device anzusteuern, die müssten entweder in HEX oder BINÄR sein. Gibt es eine Möglichkeit, dass mann die Werte in en Textboxen nur in HEX oder Binär eingbit und diese dann über den Serialport an dem Arduino sendet, zum speichern auf die SD karte ?

    Also z.b in die Textbox txtslaveadr_i2c soll ja die adresse des i2c geräts angegeben werden, die z.b. 0x58 wäre.
    Genau so möchte ich sie senden, doch nicht als string, sondern wirklich 0x58 als Hex wert oder binär. Wäre es möglich?7

    milito schrieb:

    Wäre es möglich?
    So was:

    VB.NET-Quellcode

    1. Dim value As Integer = 12345
    2. Dim strHex = Convert.ToString(value, 16)
    3. Dim strBin = Convert.ToString(value, 2)
    4. MessageBox.Show(strHex & Environment.NewLine & strBin)
    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!

    RodFromGermany schrieb:

    milito schrieb:

    Wäre es möglich?
    So was:

    VB.NET-Quellcode

    1. Dim value As Integer = 12345
    2. Dim strHex = Convert.ToString(value, 16)
    3. Dim strBin = Convert.ToString(value, 2)
    4. MessageBox.Show(strHex & Environment.NewLine & strBin)
    Ok :D. Danke echt für deine Hilfe.
    d.h. so kann ich in die txtbox wirklich 58 eingeben und durch Convert.toString(value,16) nimmt er das also 58 als Hexwert an oder interpretiert er diesen als dezimal und wandelt dann um?
    Ich bräuchte es nämlich so, dass wenn ich 58 eingebe ich es als Hexwert meinte also 0x58.
    ist das mit

    Quellcode

    1. MessageBox.Show(strHex & Environment.NewLine & strBin)
    zum verhindern, dass man andere werte als Binär oder Hex eingibt?
    Bzw wie kann ich vermeiden, dass andere werte als Hex oder Bin eingeben werden`?

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

    milito schrieb:

    meinte also 0x58.
    Das wird so nicht gehen, denn 1010101 kann ein Dualwert, ein Oktalwert, ein Dezimalwert oder ein Hexadezimalwert sein.
    Da musst Du schon eine richtige Beschriftung dran machen und auf die Vernunft des Benutzers hoffen.
    Und:
    Hexadezimal und Dezimal sind lediglich Stringrepräsentationen einer Zahl, die im Rechner binär abgelegt ist.
    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!
    Hmm ok, also gibt es da keine möglichkeit, die eingabe auf Binärwerte und Hexadezimal-Werte zu beschränken, sodass diese auch dann also solche abgepsichert werden ? :( bzw. dass man auch die textboc überprüft, ob es ein binär oder hexwert ist.
    wäre eroblem ist, wen ich zb den 58(hex) in binär schreiben würde also folgendermaßen (1011000) in die Textbox und ich es mit COnvertToString(value, 16) mache, habe ich nicht die 0x58 oder?
    Er interpretiert es als String oder Täusche ich mich?

    Ich hoffe, du hst verstanden, welches Problem ich meine ?

    Meine Idee war es, die Textboxen, in der die Steuerparamete für I2c(Register, slave-adresse, Data-byte) eingegeben werden, wirklich in binär z.b.
    slaveadresse 0x58 oder in binär 1011000 eingebe , diese abschicke zum Arduino via Serialport und diese wirklich als eingegebener Wert in Hex oder Bin interpretiert wird ud nicht als String, denn ds wäre wieder ein Anderer Wert.

    Also mir fehlt jetzt ein Lösungsanstz, du wüsstest auch nichts mehr? Bzw wie man es realisieren könnte?

    Wäre es vllt möglich, dass man die Eingabe nur auf Binär prüft und der eingegebener Wert auch wirklich einem Binärwert entspricht? und mit dem arbeitet?

    milito schrieb:

    Wäre es vllt möglich, dass man die Eingabe nur auf Binär prüft und der eingegebener Wert auch wirklich einem Binärwert entspricht?
    Dies ginge sehr einfach.
    Du kannst einer TextBox im KeyDown-Event sagen, dass lediglich die Tasten
    0 und 1 (binär)
    0 bis 7 (oktal)
    0 bis 9 (dezimal)
    0 bis 9 sowie a bis f (hexadezimal)
    erlaubt sind.
    Ergebnis ist da immer ein String!
    Und dieser String wird nach Deinen Anforderungen in ein Integer konvertiert und dann zur Übertragung in das System, das Du brauchst.
    Bedenke, dass der User ggf. ein DAU ist, der hat mit Binär und Hex nix am Hut. Ein normaler Mensch denkt dezimal.
    Also lass die GUI dezimal agieren, und was Du in Deinem Programm machst, ist Dir überlassen.
    Und bedenke: Hex-, Dez- und Oktalwerte sind lediglich String-Repräsentationen eines im Rechner binär vorliegenden Wertes.
    @Eierlein: Du hast das Problem ggf. nicht verstanden. :S
    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!

    RodFromGermany schrieb:

    Hi, danke für deine schnellen Antworten, also deine Idee wäre dass man die 0x58 als Dezimal vom User eingeben lässt bzw er es dann als dezimal wert verarbeitet.
    So jetzt eine Verständnis frage, wenn ich in die txtbox zb. 33 eingebe ist es ja ein String, und wenn ich Sie in dezimal konvertiere ist es dann auch 33.

    Ok, d.h. aber wenn es erfahrene User sind, die sich die Adresse vom i2c device aus dem Datenblatt holen und da steht 0x58, dann würde ich als User 0x58 eingeben, deshalb würde ich die mit der Hex/Bin variante bevorzugen.
    Poblem ist, ich bin halt mit der Eingabe verwirrt, das ist ja immer ein String an sich, so d.h. wenn ich 11 eingebe, wäre es in dez auch 11? und in Hex und Bin wie wäre der Wert?

    Und die Werte die ich in die Textbox eingebe, sende ich ja via Serialport an dem Arduino und speichere die erstmalig in die Sd karte in eine csv datei ab. Nach betätigen eines Tasters am Arduino soll er sie auslesen und damit den i2c device ansteuern.
    So jetzt die frage, nehmen wir mal an, ich habe den Wert nach meinen bedürfnissen in dez /hex oder bin umgewandelt dem arduino gesendet und in die csv datei abgespeichert. Behält dieser Wert seine Eigenschaft als Hex/Bin oder Dez zahl oder ist es wieder ein String?

    RodFromGermany schrieb:


    RodFromGermany schrieb:

    milito schrieb:

    Wäre es vllt möglich, dass man die Eingabe nur auf Binär prüft und der eingegebener Wert auch wirklich einem Binärwert entspricht?
    Dies ginge sehr einfach.
    Du kannst einer TextBox im KeyDown-Event sagen, dass lediglich die Tasten
    0 und 1 (binär)
    0 bis 7 (oktal)
    0 bis 9 (dezimal)
    0 bis 9 sowie a bis f (hexadezimal)
    erlaubt sind.
    Ergebnis ist da immer ein String!
    Und dieser String wird nach Deinen Anforderungen in ein Integer konvertiert und dann zur Übertragung in das System, das Du brauchst.
    Bedenke, dass der User ggf. ein DAU ist, der hat mit Binär und Hex nix am Hut. Ein normaler Mensch denkt dezimal.
    Also lass die GUI dezimal agieren, und was Du in Deinem Programm machst, ist Dir überlassen.
    Und bedenke: Hex-, Dez- und Oktalwerte sind lediglich String-Repräsentationen eines im Rechner binär vorliegenden Wertes.
    @Eierlein: Du hast das Problem ggf. nicht verstanden. :S

    milito schrieb:

    wenn ich 11 eingebe, wäre es in dez auch 11? und in Hex und Bin wie wäre der Wert?
    Da gilt halt die Umkehrung:

    VB.NET-Quellcode

    1. Dim val1 = Convert.ToInt32(strHex, 16)
    2. Dim val2 = Convert.ToInt32(strBin, 2)
    Du legst fest, ob es möglich ist, die Zahlen wie auch immer eingebbar zu machen.
    Möglich wäre da z.B. ein TabControl mit den Reitern Hex, Dez und Bin, und das numerische Ergebnis wird entsprechend aus dem String berechnet.
    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!