String (objekt) vs. char array

String bedeutet dynamischer Speicher (malloc, free). Was auf µC mit sehr begrenztem RAM generell problematisch ist. Jedenfalls wenn es wie bei Strings so oft gemacht wird. Es sei denn man macht vorher reserve() um Speicher zu reservieren, bedeutet eine Konkatenation mit +, dass im Hintergrund ein neues Objekt erzeugt wird und der Speicher der zwei anderen Objekte freigegeben wird! Leute die da zig Strings aneinanderfügen wissen nicht was sie da speicher- und performance-technisch machen.

Das gleiche ist wenn der String vergrößert werden muss. Ich habe mir die Arduino Implementation nicht angeschaut, aber theoretisch kann man realloc() machen was idealerweise keine Kopie erfordert. Es ist jedoch auch möglich dass malloc() gemacht wird und der alte String einfach kopiert wird. Selbst bei realloc() kann im worst case Kopieren erforderlich sein, wenn der Heap fragmentiert ist und im aktuellen Block nicht mehr genug Platz ist.
Dann wächst ein String (oder Vektor um allgemein zu sein) nicht immer um 1. Das wäre sehr ineffizient. Statt dessen lässt man ihn um z.B. 10 oder 20 Bytes wachsen. Oder was man auch manchmal sieht ist dass der Zuwachs der Kapazität schrittweise größer wird, z.B. 2, 4, 8, 10, 10, 10. Kommt darauf wie das hier gemacht wird, aber einen gewissen Overhead hat man so oder so.

Wie gesagt, dass kann man mit reserve() etwas umgehen:

Damit wird gleich so viel Speicher alloziert wie man angibt. Dann kann man Strings aneinanderfügen ohne dass das interne Array unbedingt vergrößert werden muss.

Ein anderes großes Problem der String Klasse ist aber, dass die Arduino Implementation sehr minimal ist. Man kann kaum etwas damit machen. Die Standard C String Funktionen in string.h und stdlib.h erlauben wesentlich mehr. Das hat auch die C++ String Klasse etwas an sich, aber da kann man wenigstens mit c_str() einen Zeiger auf das interne Array erhalten. Nicht so mit der Arduino Klasse. Um da einen C String draus zu machen, muss man ein neues Array anlegen. Dann kann man auch gleich C Strings verwenden.

Beim Einlesen hast du zwei Optionen:
1.) immer Teil-Strings bis ein Komma kommt und gleich verarbeiten
2.) den gesamten String einlesen und danach splitten, z.B. mit strtok()