String (objekt) vs. char array

SBond:
...aber es kann ja nur besser werden :wink:

Habe Dir mal was aufgeschrieben, nur mit char-Array und char-Pointern.
Dabei bin ich mal davon ausgegangen, dass am Zeilenende ein ASCII-13 ("CR") gesendet wird:

void setup() {
  Serial.begin(115200);
}

char* SerialStringRead()
{
  static char text[81];
  static byte charcount=0;
  if (!Serial.available()) return NULL;
  if (charcount==0) memset(text,0,sizeof(text));
  char c=Serial.read();
  if (c>=32 && charcount<sizeof(text)-1) 
  {
    text[charcount]=c;
    charcount++;
  }
  else if (c==13) 
  {
    charcount=0;
    return text;
  }
  return NULL;
}

void Auswertung(char* text)
{
//  char text[]="$ACCAL,1120,895,0,D2,4220*14";
  int CRC_empfangen, CRC_berechnet=0;
  char* searchPtr=strchr(text,'*');
  if (searchPtr!=NULL) 
  {
    CRC_empfangen=strtol(searchPtr+1, NULL, 16);
    for (int i=1;i<searchPtr-text;i++) CRC_berechnet^= (int)text[i];
  }
  else CRC_empfangen=-1; // no crc in string
  if (CRC_empfangen==CRC_berechnet) // fehlerfrei empfangen
  {
    Serial.println(F("CRC OK"));
    searchPtr=strtok(text,",*");
    while (searchPtr!=NULL)
    {
      Serial.println(searchPtr);
      searchPtr=strtok(NULL,",*");
    }
  }
  else 
  {
    Serial.print(F("CRC falsch: "));
    Serial.println(text);
  }
}

int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}


void loop() 
{
  char* strPtr=SerialStringRead();
  if (strPtr!=NULL) 
  {
    Auswertung(strPtr);
    Serial.print(F("RAM frei: "));
    Serial.println(freeRam());
  }
}

Die freeRam-Funktion gibt am Ende noch den freien Speicher aus.
Du kannst ja mal spaßeshalber in Deinen Code auch noch die freeRam-Funktion einbauen und vergleichen.