Zahlenfolgen an Arduino senden

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Matze396.

    Zahlenfolgen an Arduino senden

    Hallo,

    ich habe seit neusten einen Arduino. Habe eine kleine Ampel gebaut. Kann dessen Status (rot, gelb, grün) auch über eine VB Applikation abfragen, jedoch gelingt es mir nicht Zahlen bzw. -folgen an den Arduino zu senden, die der Arduino dann in Befehle auswerten soll(zB. die Ampel über den Computer schalten)

    Connect:

    VB.NET-Quellcode

    1. Sub ConnectSerial()
    2. Try
    3. Port.BaudRate = 9600
    4. Port.PortName = "COM13"
    5. Port.Open()
    6. Catch
    7. Port.Close()
    8. End Try
    9. End Sub




    Status Abfrage:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    2. Try
    3. If Port.IsOpen Then
    4. fetchedData = Port.ReadLine
    5. RichTextBox1.Text = RichTextBox1.Text & vbNewLine & fetchedData
    6. If DownOrd = 1 Then
    7. Gruenstate = fetchedData
    8. ElseIf DownOrd = 2 Then
    9. Gelbstate = fetchedData
    10. ElseIf DownOrd = 3 Then
    11. Rotstate = fetchedData
    12. DownOrd = "0"
    13. End If
    14. DownOrd += 1
    15. colortick()
    16. End If
    17. Catch ex As Exception
    18. MsgBox(ex.ToString)
    19. End Try
    20. End Sub
    21. Sub colortick()
    22. Try
    23. If Gruenstate = 1 Then
    24. OvalShape3.FillColor = Color.Green
    25. Else
    26. OvalShape3.FillColor = Color.Transparent
    27. End If
    28. If Gelbstate = 1 Then
    29. OvalShape2.FillColor = Color.Yellow
    30. Else
    31. OvalShape2.FillColor = Color.Transparent
    32. End If
    33. If Rotstate = 1 Then
    34. OvalShape1.FillColor = Color.Red
    35. Else
    36. OvalShape1.FillColor = Color.Transparent
    37. End If
    38. Catch ex As Exception
    39. MsgBox(ex.ToString)
    40. End Try
    41. End Sub



    So und jetzt das Problemkind

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. If Port.IsOpen Then
    3. Port.Write("44")
    4. fetchedData = Port.ReadLine
    5. RichTextBox1.Text = RichTextBox1.Text & fetchedData
    6. Else
    7. ConnectSerial()
    8. Port.Write("44")
    9. End If
    10. End Sub


    Ich kann nicht mal den Button teilweise anklicken oder das Fenster verschieben, als wie wenn das Programm eingefroren wäre aber die Abfragen werden weiterhin ausgeführt.
    Also fakt ist: Kann Programm nicht anklicken oder bedienen & die Nachricht wird nichtmal gesendet.
    Was ist das Problem?

    Gruss
    Matze396
    Hallo Matze,
    ich würde nach dem schreiben die Verbindung wieder schließen. Ich habs so gemacht.

    VB.NET-Quellcode

    1. ​Private Sub senden_(sender As Object, e As EventArgs) Handles bt_senden.Click
    2. sString = sTemp & sWert & mSchl
    3. sp.Open()
    4. sp.Write(sString)
    5. Dim erg1 As DialogResult = MessageBox.Show(" Daten gesendet ! ", "Programmmeldung", _
    6. MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
    7. Select Case erg1
    8. Case DialogResult.OK
    9. sp.Close()
    10. End Select
    11. End Sub
    Moin Matze,

    das liegt daran, dass Port.ReadLine die Ausführung solsnge blockiert, bis eine komplette Zeile empfangen wurde. Schaue dir mal das Event DataReceived des SerialPort an.
    Mit freundlichen Grüßen,
    Thunderbolt
    Hallo,
    wie geschrieben kannst du das DataReceived Event nutzen. In deinem Code läuft ein Timer der alle x Sekunden die letzte Zeile einließt. Wenn nichts da ist wartet ReadLine solange bist du was empfängst. Alternativ sollte man das DataReceived Event nutzen, denn diese wird nur ausgelöst, wenn wie der Name schon sagt, wenn Daten empfangen werden.
    Hier mal ein Beispiel:

    VB.NET-Quellcode

    1. Dim inputdata as String = ""
    2. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    3. inputdata = SerialPort1.ReadExisting
    4. Me.Invoke(New EventHandler(AddressOf DoUpdate))
    5. End Sub
    6. Public Sub DoUpdate()
    7. 'irgendwas mit inputdata machen
    8. End Sub


    Tim
    @tim14996 What?
    @Matze396 Wenn, dann so:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim inputdata = SerialPort1.ReadExisting
    3. Me.Invoke(Sub() DoUpdate(inputdata))
    4. End Sub
    5. Public Sub DoUpdate(inputdata As String)
    6. 'irgendwas mit inputdata machen
    7. 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!