Aus readexisting mittels streamreader ein readline machen.



  • An einer Seriellen Schnittstelle lese ich Daten über Readexisting ein. Readline kann ich in meinem Fall aber leider nicht benutzen, da beim auslesen der Echtzeitdaten nicht immer ein Newline gesendet wird. Nun wollte ich also aus den ankommenden Daten(readexisting) sozusagen ein Readline machen.

    Mit anderen Worten:
    "lese solange daten bis ein Newline erkannt wurde und übergebe es in einen String"

    Ich übergebe die Daten in meine Klasse.

    datenIn += datenfromserial
    

    Dann mache ich dieses:

    try
                {
                StreamReader sr = new StreamReader(datenIn);
                datenOut += sr.ReadLine();
                sr.Close();
                }
    

    Irgendwie will mir das aber nicht so recht gelingen, bin da noch nicht ganz so erfahren drin. Vielleicht kann mir da ja jemand behilflich sein.
    Funktioniert das mit dem streamreader in meinem fall überhaupt, solange die Daten immernoch wieder hinzugefügt werden?



  • Was passiert denn und was erwartest du?



  • Er geht immer wieder in den catch Block.

    ich erwarte mir davon, das

    sr.readline
    

    mir die erste Zeile des Strings ausgibt in

    datenout
    

    , wenn im String selbst die zweite Zeile geschrieben ist.

    Vorher

    String datenIn = "Paket1Paket2Paket3Pak\r\n
                       et4"
    

    Nacher

    String datenIn = "et4"
    String datenOut = "Paket1Paket2Paket3Pak"
    

    Denn dann kann ich die einzelnen Lines in datenOut weiter verarbeiten.



  • Und was für eine Exception erhältst du dabei?



  • ~~Wie sieht der Fehler aus, den du erhältst? Übrigens denke ich, ist der Streamreader eigentlich garnicht notwendig. Ich denke mit reinen String-Operationen kommst du da schon weit genug.

    [code="cs"]
    string myInput = String.Concat("Hallo Welt", Environment.NewLine, "Hello World");
    string myOutput = String.Empty;

    int pos = myInput.IndexOf(Environment.NewLine);
    myOutput += myInput.Substring(0, pos);
    myInput = myInput.Substring(pos, myInput.Length - myOutput.Length);
    [/code]

    Auf deine Bedürfnisse angepasst, solltest du damit denke ich weit genug kommen.
    ~~

    BTW: Was wird denn für eine Exception geworfen? Das er in den Catch-Block springt ist keine Fehlerbeschreibung.

    // EDIT: OK also File not found.
    -> Nutze statt dem StreamReader den StringReader.



  • System.ArgumentException: "Illegales Zeichen im Pfad."
    

  • Administrator

    Shoocy schrieb:

    System.ArgumentException: "Illegales Zeichen im Pfad."
    

    Hast du dir denn schon mal ausgegeben, was in datenOut steht? Also aus was dieser Pfad besteht?



  • Hatte das ganze gegen Stringreader getauscht, und damit ging es zumindest. Hab es allerdings zwischenzeitlich anders gelöst.

    datenIn += datenfromSerial;                                    // Daten einlesen
    
                        string[] lines = datenIn.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
                        foreach (String s in lines)
                    {
    
                        datenOut += s + "\r\n";          // Kontrollausgabe
    
                    }
    

    Das funktioniert soweit schon ganz gut, komischerweise schreibt er die letzte Zeile nur nicht vollständig zuende, erst wenn erneut Daten kommen. Man sollte doch meinen das die letzten einkommenden Daten über den Eventhandler in Zeile 1 dem String datenIn mit dem CRLF zugewiesen wird, das alles über die Schleife raus gehen sollte. Und genau da häng ich jetzt noch fest.



  • Jetzt klappt es. Das "ReceivedBytes Thresehold" hatte ich nicht auf 1 🙄


Log in to reply