If you read the documentation on the ReadExisting function, you'll see there is a warning that bytes could get left in the internal buffer because of the way that function works. MSDN Library Link Here
If the data coming in is terminated with a CR or CR/LF, you can use ReadLine instead... which will block until it sees the CR character on the input stream. Most devices will terminate their communications with a CR automatically. If you can tolerate a possible delay or handle a situation where you may not get a CR (by specifying a timeout on that function and handling the exception) then this is one of the best functions to use (in my opinion anyway). It returns essentially a single "message" from the device without worrying about detecting the CR/Length/etc.
Alternately, you can query the serial port on a regular basis looking for characters to be present by checking the BytesToRead property. If that is greater than 0, use ReadByte, ReadChar, or ReadTo depending on your encoding and needs.
Honestly, I'm not sure why ReadExisting is even available. I guess for high-speed applications where you might need the contents of the buffer and the underlying stream, you might need something like this, but for general serial port work, you should probably avoid it. The other "read" functions work only on the buffer which should be sufficient for nearly everything and avoids the complexity of dealing with both the buffer and the stream.
I've done a lot of serial port work over the years. If you have any more questions, shoot me a message and I'll try to give you some help.