Substring funktioniert nicht

Hallo zusammen,

ich verzweifel gerade ein bisschen, beim zerschneiden eines Strings.

Ich bekomme mittels Serial-Communication Werte von Arduino, die dann der Nodemcu ausliest und dann speichert.

Nun möchte ich gerne den String zerschneiden, nur funktioniert es nicht.

Es wird mir immer den kompletten String ausgegeben, nicht den gekürzten Teil.

while(!Serial.available())
  {

    data = Serial.read();

    values += data;

      if (values.length() > 0) 
      {

     //Serial.println(values);

     temperature = values.substring(11,17);
     ph = values.substring(21,26);
     tds = values.substring(30,37);
     tdsEC = values.substring(44,51);
     
     Serial.println(temperature);
     Serial.println(ph);
     Serial.println(tds);
     Serial.println(tdsEC);

     }
     
  }​​

Gruß,

Peter

Solange nichts da ist, verarbeite es.

Wenn die Länge größer Null ist, greife auf Subelemente 11+, 21+, 30+, 44+ zu.

Klingt nicht besonders erfolgversprechend.

ich empfehle dir
a) zum Empfangen von Daten und zerteilen derselbigen, halte dich nach diesem Tutorial: Serial Input Basics - updated
(Alle Beispiele durchgehen, nicht beim ersten Aufhören zu lesen!!!)

b) erzähl mehr über dein Vorhaben, mach ein Schematisches Bild.
Weil "Arduino" + "NodeMCU" + "Serial" klingt für mich, als hättest du dir da eine Komplexitität hineingebaut, die man möglicherweise umgehen kann.

Ihr Problem ist, dass Sie eine Möglichkeit benötigen, die serielle Eingabe abzugrenzen, damit Sie wissen, wann Sie Teilzeichenfolgen verwenden müssen.
Schlagen Sie vor, am Ende der Daten am sendenden Ende ein '\ n' (Zeilenumbruch) einzufügen.
Siehe mein tutorial Arduino Software Solutions
Damit haben Sie mehrere Möglichkeiten, Strings aus Serial zu lesen, die durch Zeilenumbrüche abgeschlossen sind.

Die vollständige Skizze ReadToInt_String.ino kombiniert Read a line - non-blocking und Arduino String to Int / Long oben zu einer einzigen Skizze, die eine Eingabezeile mit nur einem int liest und konvertiert und ungültige Eingaben zurückweist.

Ich habe den Arduino und den Nodemcu über Tx und Rx verbunden.

Das ist eh keine gute Lösung, da TX und RX für die USB-Kommunikation verwendet wird.

Und schau dir dies an, da ist es doch gut beschrieben.

So lange noch nichts empfangen wurde

Das Ausrufezeichen bedeutet NOT
als pseudo-code
while(NOT Serial.available())

gehe in die Schleife rein

if (values.length() > 0) 

sobald auch nur ein einzelnes Zeichen empfangen wurde
fange an den String zu zerlegen.

also mit Verlaub das haste so dermaßen über fünf wacklige Daumen gepeilt das das wirklich nicht funktionieren kann.

Arbeite das Tutorial: Serial Input Basics - updated
durch oder lese die Seiten von drmpf durch.
drmpf hat eine Library SafeString entwickelt der sehr Komfortable Möglichkeiten bietet.

Wenn etwas mehr kann als ein Lichtschalter kann (An/Aus)

dann braucht man auch deutlich länger als 10 Sekunden um es zu verstehen.
Und muss sich deutlich mehr als eine Textzeile durchlesen.

vgs

Haben Sie den 'Level-Übersetzer' zwischen 5V Uno und 3v3 Volt Node installiert?
Ein Widerstandsteiler oder eine Diode
Diode Diodenschaltung unten
SerialComsPair_ESP8266.pdf (52.9 KB)

Hier zwei komplette Skizzen und Schaltung für Uno SoftwareSerial zu ESP8266 SoftwareSerial

UnoSoftSerialCSVToESP8266.ino (2.2 KB)
ESP8266CSV_fromUno.ino (2.5 KB)


The ESP8266 output (with SafeString::setOutput(Serial); debug and error msg enabled) is

Received '2.317,1.153,tds_9,tdsEC_9'
SafeString textReceived cap:63 len:25 '2.317,1.153,tds_9,tdsEC_9'
Deserialized to ->  temperature:2.32 ph:1.15 tds_9 tdsEC_9