1. А почему в коде нет калибровки генератора? Или это я не нашёл? По идее это первое, что нужно сделать:
Возможно в этом и причина того, что в протеусе работает, а на макетке - нет. Протеус - это же сферический конь в вакууме.
2. В целом, по теме, IMHO, лучше не делать никаких контрольных стартовых байтов для проверки на помеху, чтоб лишний трафик не плодить. Можно сделать сэмплирование, как в оригинальном аппаратном UART. Берём три сэмпла внутри бита, с небольшими задержками. Если все три совпадают - значит не помеха.
Конечно если скорость большая, то можно так и не успеть, но если маленькая, мне кажется лучше так.