Serial comms is trickier than most people think
I think that you are making the common mistake of assuming that all your data will arrive in one 'lump' in the NewData event. This is not so (unless you are using AsyncStreams in prefix mode which I suspect that you can't here). Your data can arrive split into several portions over multiple events so you should buffer successive receipts of data concatenating them into a buffer and examine that buffer in each event to see if your packet is complete.
When you add in the possibility of corrupted characters due to noise on the line, timeouts for missing characters that never arrive to complete a packet and the need to re-synchronize transmission when that happens a robust serial comms package can get quite complicated - see the TCP/IP protocols for examples of that!