Serielle Datenübertragung - Auslesen mit WPF C#

Hallo,

ich hoffe das ich hier nicht ganz falsch bin.

Ich habe mir ein kleines Messprogramm für verschiedene Sensoren im Arduino geschrieben. Die Daten schicke ich aktuell über die Serielle Schnittstelle raus.
Soweit funktioniert das super.

Zusätzlich wollte ich mir mit WPF /C# eine Oberfläche schreiben, die mir die Daten direkt während dem Messen anzeigt, und später ggf. abspeichert.

Aktuell hänge ich da aber leider noch am Auslesen der Daten..
Teilweise wird mir die Zeile nicht komplett gelesen, bzw. zu früh ausgegeben, obwohl ich warte bis ein Newline kommt. (Denke ich zumindest)

Zumindest funktioniert es nicht immer zu 100% und ich habe keine Idee mehr woran es liegen könnte. Hier mal eine richtige Übertragung, und dann 2 falsche, wo die Zeile einfach zu früh rausgeschrieben wird.



Info noch zu mir -> Anfänger in Sachen Arduino und C# / WPF usw.
Ist erst mal nur ein kleines Projekt, um die Sprache zu lernen.

Ansonsten hier ein Ausschnitt aus meinem C# Code:

//Variablen deklaration:
private static readonly string breakCondition = Environment.NewLine; //CRLF

....... 

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {

            dataToRecieve += Serial_Arduino.ReadExisting(); //Serielle Daten lesen
            if (dataToRecieve.Contains(breakCondition)) // Ist die Zeile zuende?
            {
                //Falls empfangene Daten mehr als einen Wert enthalten
                // Werden die Daten in ein Array geschrieben, und danach komplett in die RTB Box
                char[] splitter = new char[] { '\r', '\n' }; //Trenner für das Array
                string[] data_split = dataToRecieve.Split(splitter, StringSplitOptions.RemoveEmptyEntries); //Array erstellen aus String mit Trennen @ CarrigeReturn & Newline + leere Arrays entfernen
                //int ArraySize = data_split.Length-1; // Größe des Arrays
                foreach (string entry in data_split) //Durch jedes Array durchgehen
                {
                    RichTextBoxWrite(entry + "\r\n"); //Text in RTB Box schreiben
                    try //Wenn es daten sind - in double umwandeln und in Grafik anzeigen
                    {
                        string dataToTransmit = entry.Replace(".", ","); //punkt durch komma ersetzen falls erforderlich
                        //Split Values in x-Axis | Y1 | Y2 | Y....
                        string[] dataValues = dataToTransmit.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); //Sensoren die durch ; getrennt sind, aufsplitten in ein array
                        //Convert string into double - Y1
                        double X = Convert.ToDouble(dataValues[0]); //Array Index 0 = Time
                        for (int iY=1; iY <= dataValues.Length-1; iY++)
                        {
                            double Y = Convert.ToDouble(dataValues[iY]); //folgende Arrays = Sensoren
                            switch (iY)
                                {
                                case 1:
                                    Dispatcher.BeginInvoke(new Action(() => { Serial_data_Y1.Add(new KeyValuePair<double, double>(X, Y)); }));//Index 0(Time) und die Y Werte in Grafik eintragen
                                    break;

                                case 2:
                                    Dispatcher.BeginInvoke(new Action(() => { Serial_data_Y2.Add(new KeyValuePair<double, double>(X, Y)); }));//Index 0(Time) und die Y Werte in Grafik eintragen
                                    break;

                            }
                        }

                    }
                    catch
                    {


                    }

                }

                //Daten die angekommen sind wieder zurücksetzen.
                dataToRecieve = string.Empty;
            }



        }


Was sagt denn der Debugger, wenn Du einen Breakpoint auf

dataToRecieve

setzt? Dann mit F8 Zeile für Zeile mal durchgehen und schauen was passiert.

Meine Vermutung: Der splittet '\r' & '\n' zu zwei entries.
Du kannst auch direkt nach Environment.NewLine splitten.

Da das Problem auf der PC Seite und der C# Programmierung liegt, rate ich Dir in einem C# Forum nachzufragen. Da sind mehr Leute unterwegs die sich mit C# auskennen.
Grüße Uwe

Danke schonmal für die Antworten.
Sobald ich es schritt für schritt durchgehe mit dem Debugger, scheint es zu gehen, wahrscheinlich einfach weil mehr daten auflaufen, und dann keine Teilstücke mehr ankommen.

@uwefed
Alles klar, dann werde ich wohl da auch irgendwo mal einen Account machen. Hatte die Hoffnung das ich nicht der einzige bin der sowas machen will, oder evtl. schon fertig gebastelt hat.

Normalerweise nimmt man Processing, eine leichte Programmierpacket in Java ähnlich wie die Arduino IDE gemacht.
Grüße Uwe

Statt dem DataReceived Event Handler kannst du auch mal regelmäßiges Pollen mit einem Timer probieren. Das kann manchmal zuverlässiger sein

Und statt ReadExisting() gibt es ReadLine() welches bis zu deinem Endzeichen wartet:

ReadExisting() liest - wie der Name sagt - einfach alles ein was gerade im Puffer ist und wartet eben nicht bis zu Ende

Vielen Dank @Serenifly !

Statt alles was kommt direkt zu lesen und dann abzufragen ob eine Newline dabei ist, funktioniert das "ReadLine()" offenbar besser.
Hab jetzt bestimmt schon über 20x die Messung gestartet/gestoppt. Alles richtig.

Das hat offenbar das Problem behoben.
Der Grund ist mir zwar nicht ganz klar, aber vielleicht ergibt das ja auch irgendwann Sinn :wink:

Generelles Danke an alle beteiligte - hier wird sich immer bemüht eine Lösung zu finden, selbst wenn es nur indirekt um den Arduino selbst geht. Vielen Dank.