Ich bevorzuge eigentlich das Lesen einzelner Zeichen, die ich dann selbst in Array oder string hinzufüge.

+ Man kann da einen Timeout einbauen
+ Falls die Gegenseite mal das \n vergisst, kann man aufhören wenn es zuviel wird (die Teensy Implementierung von readStringUntil hat im Gegensatz zu Arduino eine einstellbare Maximallänge)
+ Man kann auch Zeilenenden wie \r\n beachten
+ Steuerzeichen kann man ignorieren, z.B. Falls da jemand auf der Gegenseite von Hand tippt
+ Spezialprotokolle wie das obige mit STX kann man gut behandeln, einfach erst mit dem Lesen anfangen, wenn man ein Startzeichen gesehen hat

- - - Aktualisiert - - -

Ok, immerhin einen Timeout haben sie bei Arduino
Code:
String Stream::readStringUntil(char terminator)
{
  String ret;
  int c = timedRead();
  while (c >= 0 && c != terminator)
  {
    ret += (char)c;
    c = timedRead();
  }
  return ret;
}
beim Teensy sieht die Funktion so aus
Code:
String Stream::readStringUntil(char terminator, size_t max)
{
	String str;
	size_t length = 0;
	while (length < max) {
		int c = timedRead();
		if (c < 0) {
			setReadError();
			break;	// timeout
		}
		if (c == 0 || c == terminator) break;
		str += (char)c;
		length++;
	}
	return str;
}
Das ist ist ja fast wie bei dem Bug in der Arduino map Funktion ...