String bis zu einem bestimmter Zeichen auslesen

Hallo Zusammen,

ich möchte gern ein String bis zu ein bestimmte Zeichen auslesen und den Rest löschen.
So sieht mein String aus: 00,0033;31,1192;0,00000;0,00600;66,00;00,00
und ich möchte gern nur 00,0033;31,1192;0,00000;0,00600 auslesen. Also ab der vierte Semikolon möchte ich den Rest meines Strings löschen.

Danke für eure Hilfe

Klasse String oder Char-Array?
Zeige doch einfach mal den Code. Wo kommt die Zeichenkette her?
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Gruß Tommy

Versuche mal sscanf. Im Thema Serial Communication / String auslesen und nur bestimmten Teil verwenden findest Du möglicherweise weitere Anregungen.

Hier ist mein Code

void write_Measurement() {
  Serial.println("WriteMeasurement:");
  for (int i = 1; i <= 31; i++) {
    if (Active_PowerSupply[i]) {
      sprintf(buf_ISR_DateiName, "ADR %02d\r", i);
      if (Serial1.print(buf_ISR_DateiName)) {
        delay(200);
        while (Serial1.available() > 0) {
          cInput = Serial1.read();
          Serial.print( cInput);
        }
        //Serial.print("receiving: ");
      }
      if (Serial1.print("DVC?\r")) {
        int counter = 0;
        delay(200);
        while (Serial1.available() > 0) {
          chbuf_ISR[counter] = Serial1.read();
          counter++;
        }

        buf_ISR = chbuf_ISR;
        now = rtc.now();
        sprintf(buf_Uhr, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
        hour = now.hour(); minute = now.minute(); second = now.second();

      }
        buf_ISR.replace(",", ";");
        buf_ISR.replace(".", ",");
        //buf_ISR = buf_ISR.substring(38,sizeof(buf_ISR));
        Serial.print(buf_Uhr);
        Serial.println(buf_ISR);

      sprintf(buf_ISR_DateiName, "%02d_log.csv", i);
      File myFile = SD.open(buf_ISR_DateiName, FILE_WRITE);    //datei öffnen
      myFile.print(buf_Uhr);
      myFile.println(buf_ISR);
      myFile.close();
    }
  }
}

Die werte. die ich bekomme, sind die Antwort meine Netzteile via die serielle Schnittstelle. Und diese Werte muss ich dann in einer CSVdatei meiner SD-Karte speicher. Aber ich möchte nicht alle werte speichern, sonder nus bis der vierte Semikolon

Einlesen musst Du sowieso alle Zeichen. Sendet Dein Netzteil ein Endezeichen, z.B. '\n' (Newline)?
Dann bis dahin einlesen und mit '\0' abschließen.
Dann kannst Du mit strtok das in seine Bestandteile aufteilen und weiter verarbeiten.

Infos zu Zeichenketten in C.

Gruß Tommy

Hallo,

leider hast Du uns nicht verraten ob es bei buf_ISR um eine String object oder eine Zeichenkette handelt.

in dem Code steht eine auskommentierte Zeile :

//buf_ISR = buf_ISR.substring(38,sizeof(buf_ISR));

daraus schliesse ich es geht um ein Objekt , und substring ist schon die richtige Methde.

string.substring(from, to)

in der IDE gibts eine Hilfe/ Referenz/Stringobjekt Substring

lesen und anwenden.

Heinz

Beim einlesen muss zwar alle Zeichen lesen. Aber beim Speichern des eingelesenen String in der SD-Karte, möchte ich nicht alle Zeichen speichern. Ich möchte alle Zeichen bis der letzte Semikolon speichern.
zum Beispiel
if(buf_ISR=';') buf_ISR='0'
myFile.println(buf_ISR)

So habe ich gedacht, aber klappt das nicht.

Hast Du Dir den Inhalt des Links, den ich Dir gegeben habe angeschaut?
Meine Frage nach dem Endezeichen könntest Du auch beantworten.

Gruß Tommy

buf_ISR ist ein String

Das Link hat mir nicht geholfen. Die Netzteile schicken kein Zeichen am Ende. Ich kann auch kein substring verwenden, weil die werte, die jede Netzteile schicken, nicht alle gleich lang sind. Aber jeder Netzteil hat die gleiche Anzahl von Semikolon. Deshalb möchte ich bis der letzte semikolon speichern

Wenn Dir strtok beim Zerlegen nicht hilft, dann sollterst Du Dein Konzept prüfen.
Du kannst natürlich auch mit strchr arbeiten und zählen.

Woher willst Du überhaupt wissen, wann die Nachricht von Deinem Netzteil beginnt und wann sie zu Ende ist?

Gruß Tommy

Du kannst natürlich auch einfach die ganze Zeichenkette durchgehen, bis Du das 4. Semikolon gefunden hast und dann die Zeichenkette mit 0 beenden.

z.B. (quick & dirty)

char text[] = "1234;55.66;7789;abcde;cdef;5678";

void kuerze() {
byte z=0;
char c;
char *p = text;
  while (c = *p++) {
    if (c == ';') z++;
    if (z == 4) {
      *p=0;
      return;
    }
  }
}

void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  Serial.println(text);
  kuerze();
  Serial.println(text);
}

void loop() {

}

Ergibt als Ausgabe:

Start
1234;55.66;7789;abcde;cdef;5678
1234;55.66;7789;abcde;

Meine Frage nach Anfang und Ende der Nachricht ist aber immer noch wichtig.

Gruß Tommy

Ich kann die Nachricht meinen Netzteilen auf dem Monitor lesen. Ich möchte mein String nicht zerlegen, sondern nur ein teil davon speichern.

Ich möchte mein String nicht zerlegen, sondern nur ein teil davon speichern

Verstehe ich nicht, wie du einen Teil erhalten willst ohne zerlegen.
Wenn die Teile zwischen den Semikolons unterschiedlich lang sind, musst du natürlich Semikolons suchen, zählen und entsprechend zerlegen. Das geht am einfachsten mit Zeichenketten, wie Tommy versucht, dir zu zeigen.

Wenn außer Semikolons keine anderen Trennzeichen vorkommen, hast du das Problem, den Anfang und das Ende einer Meldung zu erkennen: an der langen Zeit zwischen zwei Meldungen?

Das was du mit Code bezeichnest, ist übrigens unbrauchbar ohne Variablendefinitionen.

Pass6:
Ich kann die Nachricht meinen Netzteilen auf dem Monitor lesen. Ich möchte mein String nicht zerlegen, sondern nur ein teil davon speichern.

Meinst Du damit den seriellen Monitor? Dann gib die Zeichen doch mal hexadezimal aus.

Gruß Tommy

Wenn der String immer gleiche Länge und Aufbau hat , sollte doch strncpy() reichen.

mfG Thorsten

Das hat er ja gerade nicht, wie der TO sagt.

Gruß Tommy

OK dann natürlich nicht. Hatte ich nicht so rausgelesen.

mfG Thorsten

Edit: Ah in #9 jetzt sehe ich es auch

Hi

Dann will ich auch Mal raten:
Da die Meldungen im Terminal gelesen werden können, vermute ich Mal ganz stark, daß Da ein CR/LF gesendet wird - sonst würde auch das Terminal nicht in die nächste Zeile springen.
Alternativ den zeitlichen Abstand erfassen, zwischen zwei Semikolons (oder Semikola, Beides korrekt) wirst Du eine wesentlich längere Pause messen können, als zwischen 'den Anderen' - der Trenner ist gefunden.

MfG

Das mit dem CR/LF vermute ich auch, deshalb habe ich den TO ja angeregt, sich die Zeichen mal Hex ausgeben zu lassen.
Er zeigt sich bisher aber wenig kooperativ.

Gruß Tommy