serialEvent is a useful way of building strings behind the scenes.
Yeah; build a string, then use a flag when it's done (when Serial.available() == 0).
Your new example won't work correctly either; think about the length of time between receiving characters.
Earlier, you said the "reading rate not fast enough" is not likely. At 9600 baud, it takes about 0.83 ms to read a character. That will interefere with my loop idea (unless I put delay(1);), caused by the time needed to receive the characters.