C# Verwerten von mehreren strings

Guten Morgen zusammen,

Ich möchte mithilfe meiner C# Anwendung mehrere strings, welche vom Arduino über SP gesendet werden, auslesen und weiter verwenden.

im Moment sende ich die Werte jeweils mit Serial.println:
45
1

Kennt jemand eine Methode, um die einzelnen Werte in C# auslesen zu können am SerialPort?

Danke schon mal im Voraus!

Hallo Bobbyno

Schaue hier mal rein:

Danke @paulpaulson

Die Serielle Kommunikation steht bereits bei mir - zumindest mit einem string den ich auslese.
Ich möchte allerdings noch einen weiteren string auslesen mit meinem Programm am PC. Da hängt es aktuell bei mir wie ich die Werte auseinander bekomme.

Verheirate die Werte doch mit einem identifyer:

Serial.println("a:" + String(45));
Serial.println("b:" + String(1));

Dann splittest Du die Daten und weist sie in einem switch-case den entsprechenden Variablen zu.

1 Like

Die Idee ist gut!

Code im Arduino:

  if(BTN_State==HIGH){
    Serial.println("a:" + winkelWert);
    Serial.println("b:1");
  }
  if (BTN_State==LOW){
    Serial.println("a:" + winkelWert);
    Serial.println("b:0");
  }

Allerdings löst er bei meinem switch-case nicht wirklich auf - kannst du mir eventuell einen Tipp geben?

        private void updateMessung(string indata)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new threadSicher(updateMessung), new object[] {indata});
            }
            switch (indata.ToLower())
            {
                case "a:":
                    lbl_Anzeige.Text = indata;
                    break;
                case "b:":
                    lbl_Grad1.Text = indata;
                    break;

            }

        }

So am Rande bei Arduino wird nicht C# verwendet :wink:

Fehlt wohl ein substring statt ToLower().
indata ethält ja den ganzen Text und nicht nur "a:"

        private void updateMessung(string indata)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new threadSicher(updateMessung), new object[] {indata});
            }

            switch (indata)
            {
                case string a when a.Contains("a"):
                    //Console.WriteLine("a gefunden");
                    lbl_Anzeige.Text = a;
                    break;
                case string b when b.Contains("b"):
                    //Console.WriteLine("b gefunden");
                    lbl_Grad1.Text = b;
                    break;

            }
        }

Damit löse ich die übermittelten Werte auf in zwei strings. Allerdings bleibt bei der Anzeige immernoch das a: bzw. b: übrig.
Jemand eine Ahnung wie ich das weg bekomme? :slight_smile:

du teilst da gar nichts auf. Du weist es abhängig vom Contains der einen oder anderen Variable zu.

c# kennt sicher was in die Richtung left right mid ...

Muss ich dir Recht geben.
Habe den Befehl string.split gefunden. Mithilfe eines definierten Trennzeichen kann ich das nun wirklich aufteilen.
Allerdings weiß ich noch nicht, wie ich an die aufgeteilten Werte wieder ran komme...

private void updateMessung(string indata)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new threadSicher(updateMessung), new object[] {indata});
            }
            string[] subs = indata.Split('|');
            foreach(var sub in subs)
            {
                Console.WriteLine(subs); //Werte werden in eigenen Zeilen ausgegeben.
            }
            lbl_Anzeige.Text = indata;
        }

Eher sub, als subs in WriteLine.

Gruß Tommy

1 Like

Warum splittest du mit |?
oben im code stand a: ... also wirst du mit einem Doppelpunkt splitten müssen.
und dann stehen teile vermutlich in sub

lbl_Anzeige.Text = subs[1];

Danke @Tommy56 das stimmt :wink:

@noiasca ich habe versucht mit einem einfachen Strich nur zu splitten, deshalb habe ich jetzt | drin.

string[] subs = indata.Split('|');
foreach (var sub in subs)
{
    Console.WriteLine(sub[1]);
}

Funktioniert leider nicht: Der Index war außerhalb des Arraybereichs.

Gibt´s irgendwo brauchbare Doku für diese Split Methode?

Split erzeugt ein Array mit der entsprechenden Länge, der Werte zwischen den Trennzeichen.

var str = "Beschreibung1|Wert1";
var arr = str.Split("|");

ergibt

arr[0] == "Beschreibung1"
arr[1] == "Wert1"

Eine "brauchbare" Doku gibt es auf lern.microsoft (ehemals MSDN):

1 Like

Und, wie schon @fony ganz zu Anfang angemerkt hat, hier haben wir mit c# nichts am Hut.
Ob Split, SubString, Contains vorhanden/sinnvoll oder was auch immer in dieser Sprache ist, ist hier offTopic.

Das müsste dann wieder subs[1] heißen.
Dir fehle ja sämtliche Grundlagen.

Gruß Tommy

@TriB Danke!!! Genau danach habe ich gesucht!

        private void updateMessung(string indata)
        {
            
            if (this.InvokeRequired)
            {
                this.Invoke(new threadSicher(updateMessung), new object[] {indata});
            }
            string[] arr = indata.Split('|');
            lbl_Anzeige.Text = arr[0];
            lbl_Grad1.Text = arr[1];
        }

@michael_x Ja das ist wohl eher auf C# (WinFormApp) bezogen hier, stimmt. Allerdings war mir davor noch nicht ganz klar, wie ich die Werte auf meinem Arduino verpacken muss, um diese vernünftig zu verarbeiten.

@Tommy56 Du magst nicht ganz unrecht haben was die Grundlagen angehen. Allerdings bin ich auch noch am lernen was Programmieren angeht. Dabei funktioniert nicht alles auf anhieb.

Danke an alle!
Ich würde den Thread hiermit schließen :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.