Comport Frage

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Comport Frage

    Hallo an alle die reinschauen und vielen dank für.

    habe hier ein kleines Problem:

    habe einen Arduino Board und emfpange vom bord eine kleine Nachricht über rs232. Bis jetzt alles toll, nur das es nicht so klapptet wie gewollt.

    Kurzes überblick:

    Der Board sendet jede 2 Sekunden "#1234$". Die Raute symbollisiert Anfang, und Doller das Ende des Strings.

    Jetzt kommt die Frage:

    ich will es so Lesen:

    VB.NET-Quellcode

    1. ... Dim ToRead As Integer = mycomPort.BytesToRead Dim Buffer(ToRead - 1) As Byte mycomPort.Read(Buffer, 0, ToRead) ...



    Eigentlich habe ich mir gedacht, dass wenn ich aus dem Puffer was entnehme, dann ist es dort weg. Dem ist es aber nicht so. Der alte Müll bleibt drin. Kurzgesagt im Buffer steht nach ersten Durchlauf: "#1234$", im zweiten "#1234$#1234$" usw.

    Wer kann mir helfen?

    Danke im Voraus.


    Und wie mache ich das zum Kuckuk dass der Code normal angezeigt wird. Nicht in einer Zeile???? :cursing:
    Du fügst den Code über den Quellcode-Modus ein.

    Zu deinem Problem:
    Du deklarierst den Buffer jedes Mal neu, daher werden die Daten sicherlich gelöscht.
    Dein Problem muss irgendwo bei mycomPort.Read liegen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private mycomPort = New IO.Ports.SerialPort("com1")
    3. Private spannung As Integer
    4. Public Sub New()
    5. InitializeComponent()
    6. Me.mycomPort.BaudRate = 115200
    7. Me.mycomPort.DataBits = 8
    8. Me.mycomPort.StopBits = IO.Ports.StopBits.One
    9. Me.mycomPort.Parity = IO.Ports.Parity.None
    10. Me.mycomPort.ReceivedBytesThreshold = 1
    11. Me.mycomPort.Open()
    12. 'Timer1.Start()
    13. End Sub
    14. Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
    15. mycomPort.write(Convert.ToChar(TrackBar1.Value))
    16. End Sub
    17. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    18. Dim ToRead As Integer = mycomPort.BytesToRead
    19. Dim Buffer(ToRead - 1) As Byte
    20. mycomPort.Read(Buffer, 0, ToRead)
    21. MaskedTextBox1.Text = Convert.ToDouble(mycomPort.readChar() / 255)
    22. End Sub
    23. Protected Overrides Sub Finalize()
    24. Me.mycomPort.close()
    25. MyBase.Finalize()
    26. End Sub
    27. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    28. Dim ToRead As Integer = mycomPort.BytesToRead
    29. Dim Buffer(ToRead - 1) As Byte
    30. mycomPort.Read(Buffer, 0, ToRead)
    31. MaskedTextBox1.Text = mycomPort.readChar()
    32. End Sub
    33. End Class


    eigenlich probiere ich es nur mit dem Button1. Der timer1 ist noch nicht umgearbeitet. er empfängt lediglich einen char.

    jetzt habe ich es gefunden wie man es formatiert. sieht doch viel verständlicher aus.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „EugenIS“ ()

    Genau.

    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 ToRead As Integer = SerialPort1.BytesToRead
    3. If ToRead > 0 Then
    4. 'Neu empfangene Zeichen an die Empfangspuffer anhängen
    5. Dim Buffer(ToRead - 1) As Byte
    6. SerialPort1.Read(Buffer, 0, ToRead)
    7. ' Buffer verarbeiten
    8. End If
    9. 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!
    irgend wie klappt der zugriff nicht.

    also: ich sende per controller einen String: "hallo"

    hab anderweitig geprüft, es kommt auch ein hallo an.

    jetzt tuh und mach ich das in visual basic reinzuprügeln, es klapptet nicht. bis jetzt habe ich das:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim comport = New IO.Ports.SerialPort("COM1")
    3. comport.Baudrate = 115200
    4. comport.Databits = 8
    5. comport.stopbits = 1
    6. comport.parity = IO.Ports.Parity.None
    7. comport.ReceivedBytesThreshold = 1
    8. comport.Open()
    9. Dim ToRead As Integer = 0
    10. While ToRead < 10
    11. Threading.Thread.Sleep(10)
    12. ToRead = comport.BytesToRead
    13. End While
    14. Dim xChar(ToRead) As Char
    15. Label1.Text = ""
    16. If ToRead > 10 Then
    17. Dim Buffer(ToRead - 1) As Byte
    18. comport.Read(Buffer, 0, ToRead)
    19. For i As Integer = 0 To ToRead - 1
    20. xChar(i) = Convert.ToChar(Buffer(i))
    21. Label1.Text = Label1.Text & xChar(i)
    22. Next
    23. End If
    24. comport.Close()
    25. End Sub


    kann jemand helfen?
    Wir schreiben VB 2008 und irgendein Windows.
    Du musst nicht das Port permanent initialisieren, denn da werden die Daten gelöscht, die ggf. da sind.
    Also: Port nur 1x initialisieren.
    Dann: Das Post unterrichtet Dich, dass Daten da sind.
    Wenn Du Pizza bestellst, gehst Du auch nicht jede Minute zut Tür, um nachzusehen, ob der Pizzamann da iat, Du wartest, bis er klingelt.
    Es kann natürlich sein, dass Daten am Port da sind, aber Du bist gerade an der Tür. Ob das nun Katrin oder der Pizzamann ist - das weiß ich nicht. :thumbsup: :thumbsup: :thumbsup:
    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!