送信する塊の括りで受信するわけではないため、常にバッファに追加書きで貯め込みながら、開始記号と終了記号がそろうごとに、そろった範囲のみを処理をする必要があります。
・開始ししか受信してない。
・前回開始受信済みで今回も終了は無い(途中しかない)
・開始と終了が複数セットまとまって受信する
・前回開始を受信していて、今回は終了と開始を受信して、2つ目の終了はない。
・1バイトづ受信する
といういろいろな可能性があります。
順序は保障されますが、送信した単位という概念はありません。なので、受信処理内でクリアしてよいのは、最後に開始とペアになった終端記号までで、それ以降は残して次で使う必要があります。そのため、受信処理内でローカル変数にコピーせずに、先頭から切り取りながら処理した方が良いと思います(後から戻そうともうと、受信イベントでの追加とコンフリクトする可能性が。
※開始記号や終端記号そのものを複数バイトにした場合、それらが分かれて受信する可能性もあり、より複雑になります。