Character based serial communications are stubbornly difficult to program in theory. There are just too many little things that you don't think about when approaching the problem from a 'get the data, process the data' perspective. The possibilities are endless: What if the port stalls and returns no more data, what if there is a character missing in the expected data, etc. In many implementations these conditions will cause your code to completely lock up and go into an infinite loop. Although the SerialPort class of the .NET framework tries to present a clean interface, underneath this abstraction are still all the realities of serial communications.
You really need a reference implementation to even begin determining the quality parameters and pros and cons of your code ( if your concept even works at all ). Some things can be designed at a high level. Serial communications is not one of things. Get a machine, any machine that can meet the essential basic needs to create a WORKING proof of concept and go from there.
What you probably want to aim for generally is something like the OSI protocol stack or TCP/IP stack. These stacks show how real robust MESSAGING system should be implemented. They include such essential features as error correction, retry aborted sessions, etc, etc.
Although you may think these methods are overkill, you will find that implementing communications is not as simple as it seems, and the above mentioned messaging stacks have developed their complex nature in response to this challenging problem. Our own C-Sharp serial port class is presented below. It is far from perfect, but it's a start.