vb.net Empfängt keine Daten von Arduino

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von C.O.D.E.

    vb.net Empfängt keine Daten von Arduino

    Hallo,

    ich bin gerade dabei zu versuchen das wenn ich einen Button an meinem Arduino klicke das ich dann etwas über die Serielle schnittstelle an VB sende und dieses dann weiter verarbeitet wird. Leider passiert bei meinem Code einfach gar nichts, auch wenn ich im Arduino Seriellen Monitor gucke, scheint keine Serielle ausgabe zu erfolgen. Das heißt das Problem liegt wahrscheinlich am Code des Arduinos...

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. With SerialPort1
    4. .PortName = "COM3"
    5. .BaudRate = 9600
    6. .ReadTimeout = 50000
    7. .Open()
    8. End With
    9. MessageBox.Show("Test Messagebox 0")
    10. End Sub
    11. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    12. Me.Invoke(Sub() ReceiveText())
    13. MessageBox.Show("Test Messagebox 2")
    14. End Sub
    15. Private Sub ReceiveText()
    16. Dim ToRead As Integer = SerialPort1.BytesToRead
    17. If ToRead > 0 Then
    18. 'Neu empfangene Zeichen an die Empfangspuffer anhängen
    19. Dim Buffer(ToRead - 1) As Byte
    20. SerialPort1.Read(Buffer, 0, ToRead)
    21. TextBox1.Text &= System.Text.Encoding.Default.GetString(Buffer)
    22. MessageBox.Show("Test Messagebox 1")
    23. End If
    24. End Sub
    25. Private Sub frmMain_Closed(sender As Object, e As EventArgs) Handles Me.Closed
    26. SerialPort1.Close()
    27. End Sub
    28. End Class


    C-Quellcode

    1. int BUTTON1 = 9;
    2. void setup() {
    3. Serial.begin(9600);
    4. pinMode(BUTTON1,INPUT);
    5. }
    6. void loop() {
    7. if (Serial.available() > 0) {
    8. if (digitalRead(BUTTON1)==HIGH){
    9. Serial.print("Hallo");
    10. }
    11. }
    12. }


    Sobald ich die Zeile "if (Serial.available() > 0) {" entferne, funktioniert der Code und ich kann mit meinem Arduino Kommunizieren. Dann kommen aber 1000000 Hallos bei meinem Programm an, ich würde gerne nur ein einziges mal das Hallo empfangen :o

    Kann mir wer helfen?
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    C.O.D.E schrieb:

    Leider passiert bei meinem Code einfach gar nichts
    Offensichtlich sendest Du nichts. ;)
    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!
    Wenn ich jetzt "if (Serial.available() > 0) {" entferne dann flooded der Arduino mein Programm, das möchte ich auch nicht. Hast du eine Idee Rod?
    Bilder
    • Unbenannt.PNG

      41,79 kB, 1.113×530, 83 mal angesehen
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    @C.O.D.E Kann es sein, dass der Arduino auf Dauersenden programmiert ist?
    Ich hab nicht so ein Teil.
    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!
    Serial.available() fragt ab, ob an der seriellen Schnittstelle des Arduinos Daten erhalten werden, d.h. wenn du Daten an Serial sendest.
    Wenn du lediglich einmal "Hallo" haben willst, kannst du deinen Code im Prinzip so lassen wie er ist, musst allerdings von deinem vb-Programm einmal, ggf. auch mehrmals, an die serielle Schnittstelle was senden, damit Serial.available() > 0 erfüllt wird.

    Der Grund warum du ohne die available() Geschichte ständig "Hallo" bekommst liegt an der loop-Methode, die wird, wie der Name schon sagt, ständig vom Arduino aufgerufen.
    Dumm ist der, der dumm ist. Nicht andersrum!

    Schmittmuthelm schrieb:

    Wenn du lediglich einmal "Hallo" haben willst, kannst du deinen Code im Prinzip so lassen wie er ist

    Bist Du dir da sicher?
    Ich meine mich erinnern zu können, dass das Flag Serial.available im Arduino so lange gesetzt bleibt, bis man Daten mittels Serial.Read aus dem Puffer gelesen hat.
    Wenn dem so ist, würden unendliche endlose Hallo Strings empfangen werden...
    @TRiViUM
    Da hast du recht, im vb-Programm führt er ja aber Private Sub ReceiveText() aus und darin SerialPort1.Read(Buffer, 0, ToRead)

    Ob das allerdings den selben Effekt hat wie das Arduino Serial.Read ist natürlich in Frage zu stellen, bzw. zu prüfen.

    Sollte das Flag durch die vb-Methode nicht zurückgesetzt werden, könnte man alternativ im Arduino-Sketch an geeigneter Stelle das Serial.Read ausführen.
    Dumm ist der, der dumm ist. Nicht andersrum!

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Schmittmuthelm“ ()

    So leute, die Lösung hatte nichts mit dem zutun was wir gedacht haben.

    1. @Schmittmuthelm Hatte recht, der Befehl "Serial.available()" wartet NUR auf auf einkommende Befehle
    2. Mein Button war nicht entprellt wodurch der Button 5-6x mehr ausgegeben hat als er sollte. (mikrocontroller.net/articles/Entprellung)
    2.1 Hierfür enmpfehle ich die Bounce2.h, hatte jetzt mehrere möglichkeiten Probiert aber diese klappt wunderbar :)

    Danke an euch :)
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!