А модно дилетанту встрять?
Если я правильно вас понял, вы по каким-то причинам не используете прерывания USART по приему, а просто опрашиваете его с определенной частотой по таймеру? Мне это напоминает анализ нажатия кнопок без прерываний по уровням на ногах, а с таким же "опросом клавиатуры" с определенной частотой. Так и опрашивайте USART всегда. Вообще всегда, и пусть ваш основной процесс крутится параллельно, а по таймеру вы заглядываете, не пришел ли очередной байт - ведь режим асинхронный. И не надо ничего ни с чем синхронизировать, а только складывать байты в мешок, можно кольцевой

А если вы асинхронно приходящие байты наделяете каким-то человеческим смыслом, мыслите в терминах "пакетов" и прочих условностей, тогда и сами эти "пакеты" лучше формировать как надо - с детерминирующими символами, определяющими начало и конец пакета, часто используются enter|return как детерминирующий конец. И тогда передающее устройство пусть хоть какие паузы делает в процессе передачи и между пакетами - вы их примете и обработаете нормально. Но не будете определять "конец пакета" по тому факту, что "то символы летели один за другим, а то у нас что-то долго ничего не приходит, значит наверное конец пакета". Или я не правильно понял вашу логику "пакетов"?