Arduino Mitteilung von C#-Programm erkennen

Hallo,

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?

Gruß
Erwin

definiere "weitere Aufgabe" ... soll er jetzt Kaffee kochen oder was soll er machen?

Du hast ja schon eine Kommunikation in beide Richtungen ... also wo ist das Problem?

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.

Quellcode beider Programme? Es reicht doch lediglich einen Statuswert der ausgeführten Funktion übermitteln. Dafür bedarf es keines Textes.

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):

void parseSerial()
{
	switch(serialBuffer[0])
	{
		case 'K':	
			setTemperature(TEMP_KESSEL, atoi(serialBuffer + 1));
			break;
		case 'V':	
			setTemperature(TEMP_VORLAUF, atof(serialBuffer + 1));
			break;
      }
}

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 :slight_smile:

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.

Die Lösunfg für das Problem ist ganz einfach, hab gestern wohl "auf dem Schlauch gestanden":

String.CompareTo Method (Object)
siehe:

Danke für eure Hilfe

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.

Es geht natürlich, aber es unnötig kompliziert