SerialPort.ReadLine verliert Daten???

  • VB.NET

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

    SerialPort.ReadLine verliert Daten???

    Hallo zusammen

    Brauche im Moment den "SerialPort1_DataReceived" event um von einem Seriellen Port Daten zu lesen wenn was da ist.
    Ich mache das mit ReadLine da folgendes an die Schnittelle gesendet wird:

    Quellcode

    1. RH-SENSOR: ERROR<\r>
    2. NFC: PASSED\r
    3. DATA: PASSED\r
    4. GPS: ERROR\r
    5. ADC: PASSED\r
    6. BATTERY: PASSED\r


    Mit ReadLine sollte ich ja nun für jede Linie einen Buffer füllen können welchen ich dann auswerten kann.
    Nur leider kommen nu die ersten zwei Zeilen rein die nächsten gehen irgendwie verloren...

    Was könnte das sein?
    Gruss
    Andi
    Da ich keinen Code sehe:
    Könnte es an den fehlenden <> liegen?
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Schamash schrieb:

    Da ich keinen Code sehe:
    Könnte es an den fehlenden <> liegen?

    Ups sorry das habe ich direkt aus dem Terminal Programm kopiert. So kommen die Infos von der Hardware an die ausgelesen werden muss jeder Wert auf einer eigenen Zeile.

    Quellcode

    1. RH-SENSOR: ERROR\r
    2. NFC: PASSED\r
    3. DATA: PASSED\r
    4. GPS: ERROR\r
    5. ADC: PASSED\r
    6. BATTERY: PASSED\r


    an diese <> liegt es somit nicht.

    Der Code ist im Moment sehr sehr simple:

    C-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim Incoming As String = SerialPort1.ReadExisting()
    3. Console.Write(Incoming)
    4. End Sub

    gekoch schrieb:

    VB.NET-Quellcode

    1. SerialPort1.ReadExisting()
    Dim txt = SerialPort1.ReadLine() funktioniert nur dann richtig, wenn die Property SerialPort1.NewLine = ControlChars.Cr korrekt befüllt ist.
    Ist sie das bei Dir?
    -----
    Benenne bitte Deinen Thread-Titel um in VB.NET.
    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!
    Nein das SerialPort1.NewLine = ControlChars.Cr ist nicht gesetzt sollte das gleich vor dem Öffnen des Portes geschehen?

    EDIT: Habs versucht, doch es erscheinen immer noch nur die ersten zwei Zeilen... (SerialPort1.NewLine = ControlChars.Cr wurde kurz vor SerialPort1.Open() platziert)
    EDIT2: Ok bekomme nun 3 Zeilen statt vorher nur 2 aber es sind ja 6 Zeilen....

    Gruss
    Andi

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

    gekoch schrieb:

    vor dem Öffnen des Portes
    muss dieses vollständig initialisiert werden.
    Ist ControlChars.Cr das richtige Zeilen-Ende-Zeichen, das die Gegenstelle sendet?
    Überzeuge Dich davon :!:
    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!
    Setze mal vor .Open() den Wert SerialPort1.ReadTimeout auf 500 oder so.
    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!
    immer noch keine Änderung...

    EDIT: Mit ​.ReadExisting kann ich alles auslesen (per ​Console.Write() ausgeben)aber eben ist es zerhackt und kann später nicht analysiert und ausgewertet werden...

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

    gekoch schrieb:

    ist es zerhackt
    Wie genau ist der Output?
    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!

    Quellcode

    1. RH-SENSOR: ERROR
    2. NFC: PASSED
    3. DATA: PASSED
    4. GPS: E
    5. RROR
    6. ADC: PASSED
    7. BATTERY: PASSED


    Es sieht für mich fast so aus als würde der Serial Port noch was im Buffer haben das kann aber nicht ausgelesen werden da die Subrutine
    ​Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived nicht
    mehr aufgerufen wird.
    Wie kann ich checken ob daten am Port noch vorhanden sind und die dann doch noch abholen?

    gekoch schrieb:

    nicht mehr aufgerufen wird.
    Liest Du die Daten an mehreren Stellen aus?
    Das sollte ausschließlich im SerialPort1.DataReceived-Event passieren.
    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!
    nein mach ich nicht
    Habe aber mal nun das gemacht und so kriege ich alles:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Do
    3. Incoming = SerialPort1.ReadLine
    4. Console.WriteLine(Incoming)
    5. Loop
    6. End Sub


    Also hat er wirklich noch was im Buffer und aknn nicht alles auslesen...
    Das sieht mir eher nach einem SerialPort1.NewLine-Problem aus.
    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!
    Habe jetzt ein Arduino genommen und was ganz ganz einfaches programmiert und zwar:
    ​Serial.print("RH-SENSOR: ERROR\rNFC: PASSED\rDATA: PASSED\rGPS: ERROR\rADC: PASSED\rBATTERY: PASSED\r");

    Mit einem Tastendruck kann ich diese Message auf den Serial Port geben. Wenn ich nun das VisualBasic programm brauche um dies
    zu empfangen bekomme ich nach dem ersten Knopfdruck nur die ersten 4 Zeilen. Wenn ich den Knopf nochmals drücke kommt die
    5te und 6te Zeile und wieder die 4 Zeilen vom Anfang.
    Also hängt da noch was im Buffer das nicht abgerufen wurde... Wie kriege ich das raus????

    Andi

    gekoch schrieb:

    Wie kriege ich das raus????
    Mit welcher BoudRate arbeitest Du?
    Probier mal dies:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Threading.Thread.Sleep(50) ' den Wert ausprobieren
    3. Incoming = SerialPort1.ReadExisting
    4. 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!

    gekoch schrieb:

    einmal
    Dann mach den Wert etwas größer.
    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!

    gekoch schrieb:

    mit 1
    finde ich merkwürdig, allerdings wird da der Thread des SerialPorts ausgebremst.
    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!