Statt dem DataReceived Event Handler kannst du auch mal regelmäßiges Pollen mit einem Timer probieren. Das kann manchmal zuverlässiger sein
Und statt ReadExisting() gibt es ReadLine() welches bis zu deinem Endzeichen wartet:
ReadExisting() liest - wie der Name sagt - einfach alles ein was gerade im Puffer ist und wartet eben nicht bis zu Ende