Вот еще один вариант "с ходу". Кладите данные в хвост
очереди. Делайте итерацию с головы. Как только встречаете маркер конца пакета (три нуля, не самый удачный маркер), делаете pop части данных. После этого проверяете этот "кусок" на длину, контрольную сумму и т.д.
Кроме того, нужно помнить о том, что
DataReceived будет работать в отдельном потоке.