Serial besser auswerten? (ParseInt kommt durcheinander)

Hallo, ich hab ausgehend vom ReadASCIIString Tut folgenden Code:

 while (mySerial.available() > 0) {

    // look for the next valid integer in the incoming serial stream:
    nodeget = mySerial.parseInt(); 
    voltget = mySerial.parseInt(); 
    tempget = mySerial.parseInt(); 
    humget = mySerial.parseInt();
   //Ist etwas angekommen?
    if(voltget>0)
    {
     //Strings in Floats umwandeln und korrigieren
      node=nodeget;
      volt=voltget/1000;
      temp=tempget/100;
      hum=humget/100;

      //An php übertragen
       httpRequest();
    }
    
  }

Was ich an mySerial schicke hat folgende Form: 0,4748,2230,5550

Leider kommt nach einer Weile alles durcheinander...

Liegt es daran, dass ich nicht alle Werte als eins übertragen sondern so:

Serial.print(payload.ident);
    Serial.print(",");
    Serial.print(payload.vcc);
    Serial.print(",");
    Serial.print(payload.temp);
    Serial.print(",");
    Serial.println(payload.feuchte);

??

Ich weiß nicht wie der "puffer" funktioniert bei Seria.available.. .

Reicht es ggf. alles in einem Paket zu senden? Oder muss ich noch ein Start/End-Zeichen einbauen?

Was würdet Ihr empfehlen? Ich hoffe man kann es einigermaßen verstehen..

parseInt() ist Blödsinn, da blockierend. Das wartet einfach bis zu eine Sekunde (oder je nach setTimeout()) ob was im Puffer steht und fängt an zu wandeln wenn die Zeit vorbei ist.

Besser ist man liest erst mal nicht-blockierend komplett ein und pflückt es dann auseinander.

const int SERIAL_BUFFER_SIZE = 31;
char serialBuffer[SERIAL_BUFFER_SIZE];

void loop()
{
     if(readSerial() == true)
         parseSerial();
}

bool readSerial()
{
	static byte index;

	while(Serial.available())
	{		
		char c = Serial.read();
		
		if(c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
		{
			serialBuffer[index++] = c;
		}
		else if(c == '\n')
		{
			serialBuffer[index] = '\0';
			index = 0;
			return true;
		}
	}
	return false;
}

void parseSerial()
{
  int value1 = atoi(strtok(serialBuffer, ","));
  int value2 = atoi(strtok(NULL, ","));
  int value3 = atoi(strtok(NULL, ","));
  int value4 = atoi(strtok(NULL, ","));


   .....
}

Schicke dazu am Ende ein Linefeed als Endezeichen! Das kann man im Serial-Monitor einstellen

Was bei positiven Integern aber auch sehr einfach geht ist das:

Damit spart man sich das zwischenspeichern und braucht keine extra Konvertierungs-Funktionen. Spart also Flash und RAM!

Aber Achtung! Das ist Prinzip-Code nur für eine Zahl! Das kann man aber leicht anpassen, dass du nach einem Komma die aktuelle Zahl ausgibst und dann eine weitere Zahl aufsummierst. Dazu bräuchte man u.a. noch eine Variable um zu zählen wie viele Zahlen man schon konvertiert hat.

Reicht es ggf. alles in einem Paket zu senden

Nein. Bei Serial gibt es keine Pakete und Serial ist langsam.

ParseInt hat eine eingebaute Verzögerung, das kompenisert die Langsamkeit, aber
while( mySerial.available() )
könnte auch für Probleme sorgen. ( soll deine Funktion denn nie fertig werden ? )
Wie Serenilfy, würde ich nichts machen ( ausser vorhandene Zeichen lesen ) bis dein EndeZeichen ‘\n’ irgendwann gekommen ist.

Auch richtig: Integer Zahlen kann man auch leicht auswerten während sie langsam reinkommen:
How to send and receive numbers
Wenn du keine negativen Zahlen hast, ist es noch einfacher.
Kannst auch statt < > Kennungen Komma und Newline ‘\n’ verwenden. Das wird dann ähnlich wie in Serenifly’s Link

Okay, ich probiere das oben gleich mal aus.

A)Reicht ein println(letzterWert) oder muss ich print(letzterWert);println(); machen?

B)Ansonsten wenn ich richtig verstehe:
readSerial() packt den SerialBuffer als globale Variable voll bis \n kommt.
ParseSerial zerhackt über strtok nach Trennzeichen.

C)Da ich alles über den Ethernetshield abschicke, bin ich nicht sicher ob vom Timing alles hinhaut.
Generell bekomme ich nur 5 Pakete pro Minute rein. Allerdings kommt es manchmal vor, dass zwei direkt nacheinander reinkommen…

Ich muss wohl mal beobachten, wie es sich dann verhält.

dertester: A)Reicht ein println(letzterWert) oder muss ich print(letzterWert);println(); machen?

Kommt aufs gleiche raus

readSerial() packt den SerialBuffer als globale Variable voll bis \n kommt. ParseSerial zerhackt über strtok nach Trennzeichen.

Korrekt.

serialBuffer könnte dabei auch lokal und static in readSerial() sein und man gibt statt bool einen char* auf den Puffer oder NULL zurück

C)Da ich alles über den Ethernetshield abschicke, bin ich nicht sicher ob vom Timing alles hinhaut. Generell bekomme ich nur 5 Pakete pro Minute rein. Allerdings kommt es manchmal vor, dass zwei direkt nacheinander reinkommen..

Gerade bei sowas sollte man das nicht-blockierend machen. Dann ist das Timing eigentlich egal und man kann zwischendurch andere Sachen machen