Mein Arduino erhält über die serielle Schnittstelle von einem C#-Programm und arbeitet dann vor sich hin. Dabei sendet er verschiedene Messwerte an das Programm, wo in einer Textbox angezeigt werden. Soweit funktioniert das Programm noch problemlos.
Hat der Arduino jedoch den Messvorgang beendet, soll das C#-Programm eine Mitteilung darüber erhalten, um eine weitere Aufgabe vom C#-Programm zu bekommen.
Ist dies über die serielle Schnittstelle realisierbar?
Das Problem ist, die Mitteilung vom Arduino zu realisieren, dass er die biserige Aufgabe erledigt hat.
Ein Beispiel:
Der Arduino sendet "Ich bin fertig!"
Mein C#-Programm soll dies dann als Zeichen verstehen, dass es eine neue Aufgabe verteilen kann.
na dann programmier das genau so, dass der Arduino diese Zeichenfolge sendet und dem C# Programm musst Du halt beibringen, auf den String zureagieren.
Für eine Kommunikation braucht es immer 3 Dinge:
a) mindestens 2 Teilnehmer
b) eine definierte Übertragungsart / Strecke
c) eine gemeinsame Sprache.
a) + b) hast Du ja schon. Und was Du als gemeinsame Sprache implementierst, ist Dir überlassen. Wichtig ist halt nur, dass Du es immer auf beiden Seiten implementierst. Was der eine sendet muss der andere nicht nur empfangen sondern auch verstehen können. Bislang sehe ich immer noch nicht, wo genau Dein Problem ist.
Wieso nicht? Einfach Text hin und her-schicken und überprüfen welche Strings empfangen wurden. Wenn du so schon weit gekommen bist verstehe ich nicht wo hier das das Problem ist.
Es müssen auch keine Romane sein. Ich mache z.B. auf Arduino Seite das um Temperatursensoren durch Slider/Trackbars in C# zu simulieren (vereinfacht):
Also nur einen einzelnen Buchstaben und dahinter eine Zahl die gewandelt wird. Dann überprüfe ich das erste Zeichen und konvertiere den Rest mit atoi(). Dadurch spare ich mir mit strcmp() zu arbeiten
In C# geht das ähnlich:
public void ParseSimulationData(string text)
{
Color offColor = Color.Gainsboro;
Color onColor = Color.Red;
if(text.StartsWith("NL"))
TextBoxPrint("\n");
else if (text.StartsWith("Text:", true, null))
TextBoxPrint(text.Substring(5) + '\n');
else if (text.StartsWith("KS"))
UpdateLabel(labelTempSollKessel, text.Substring(2));
else
{
int value;
if (Int32.TryParse(text.Substring(2), out value))
{
if (text.StartsWith("BR"))
UpdateLabel(labelStateBrenner, (value == 0) ? offColor : onColor);
......
}
}
}
Wenn ich also Text schicken will schreibe ich einfach "Text:" davor. Um eine neuen Kessel-Solltemperatur zu übertragen schreibe ich z.B: "KS56,5"
Wenn es einfach sein soll kannst du auch einfach den empfangenen Text in C# auf Gleichheit mit etwas testen.
Wenn es einfach sein soll kannst du auch einfach den empfangenen Text in C# auf Gleichheit mit etwas testen.
Genau das suche ich, aber ich habe irgendwie grad keinen Plan, wie ich das in C# schreibe.
Ich probiers dann morgen nochmal, liegt vielleicht daran, dass ich heute schon zu lange am Programmieren war
Du hast es geschafft Daten an den PC zu senden und auszugeben aber weißt nicht wie man Strings auf Gleichheit testet? Sorry, aber das ist schwer zu verstehen
In C# geht das einfach mit == oder Equals() wenn man keine besonderen Vergleichs-Optionen wie Groß/Klein-Schreibung und CultureInfo braucht. Anders als in Java z.B. ist == hierbei (fast) identisch zu Equals()
Oder schau dir mal die String Klasse an:
Wo ich an dieser Stelle große Probleme hatte war das die SerialPort Klasse in .NET elendig schlecht ist und der DataReceived Event Handler nicht richtig ausgelöst hat. Ich habe das dann dadurch umgangen dass ich einfach einen Timer laufen lasse der alle 200ms nachschaut ob Daten da sind. Das funktioniert perfekt.
Aber wenn deine Messdaten alle ankommen wird das bei dir gehen.
hättest Du gleich gefragt: "Wie kann ich in C# zwei Strings vergleichen?" hätten wir Dir auch schneller helfen können ... aber bei Deiner Fragestellung war beim besten Willen nicht zu erkenne, dass das Dein Problem war!
Das ist praktisch die C# Version von strcmp() in C
Es gibt da aber eine ganze Reihe Möglichkeiten:
das einfachste und gebräuchlichste in diesem Fall ist wie gesagt ==
Equals() ist ähnlich wie ==, hat aber ein paar subtile Unterschiede, vor allem wenn man mit Instanzen der Object Klasse arbeitet
*CompareTo() ist gedacht um Strings zu sortieren indem man das IComparable Interface implementiert
Compare() ist ähnlich wie CompareTo() aber hat noch mehr Optionen, vor allem betreffend der CultureInfo Klasse
CompareTo() wird für einfache Gleichheits Tests nicht empfohlen:
Do not use an overload of the String.Compare or CompareTo method and test for a return value of zero to determine whether two strings are equal.
Use the String.Compare and String.CompareTo methods to sort strings, not to check for equality.