I think you already answered yourself. You detect a start frame by waiting and getting a single C0. Then, you wait again in the same iteration, obtaining the rest of the frame with the final C0. There is nothing wrong in this.
Of course, there are different approaches: for example, you may read one char at a time, concatenating them in a string: when you receive a C0, you examine the collected string: if not empty, it's a frame body. Then you reset the collected string and continue.
Paolo
-------------------
LV 7.1, 2011, 2017, 2019, 2021