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;
}
}