O UART não é à prova de falhas por sua própria natureza - estamos falando da tecnologia da década de 1960 aqui.
A raiz do problema é que o UART sincroniza apenas uma vez a cada 10 bits, permitindo que muita bobagem passe entre esses períodos de sincronização. Ao contrário, por exemplo, CAN, que mostra cada bit individual várias vezes.
Qualquer erro de dois bits que ocorra dentro dos dados corromperá um quadro UART e passará despercebido. Erros de bits nos bits de início / parada podem ou não ser detectados na forma de erros de saturação.
Portanto, não importa se você usa dados ou pacotes brutos, sempre há uma probabilidade de que inversões de bits causadas por EMI resultem em dados inesperados.
Existem inúmeras maneiras de "charlatanismo tradicional do UART" para melhorar a situação um pouco. Você pode adicionar bytes de sincronização, bits de sincronização, paridade e bits de parada dupla. Você pode adicionar somas de verificação que contam a soma de todos os bytes (e depois invertê-lo - porque por que não) ou pode contar o número de binários como soma de verificação. Tudo isso é amplamente utilizado, amplamente não científico e com uma alta probabilidade de erros ausentes. Mas foi o que as pessoas fizeram das décadas de 1960 a 1990 e muitas coisas estranhas como essas vidas hoje.
A maneira mais profissional de lidar com a transmissão segura pelo UART é ter uma soma de verificação CRC de 16 bits no final do pacote. Tudo o resto não é muito seguro e tem uma alta probabilidade de erros ausentes.
Em seguida, no nível do hardware, você pode usar o diferencial RS-422 / RS-485 para melhorar drasticamente a robustez da transmissão. Esta é uma obrigação para uma transmissão segura em distâncias maiores. O UART de nível TTL deve ser usado apenas para comunicação a bordo. O RS-232 não deve ser usado para nenhum outro propósito, mas para compatibilidade retroativa com coisas antigas.
No geral, quanto mais próximo do hardware estiver o mecanismo de detecção de erros, mais eficaz ele será. Em termos de eficácia, os sinais diferenciais são os que mais agregam, seguidos pela verificação de erros de enquadramento / saturação, etc. O CRC16 adiciona um pouco e, em seguida, o "charlatanismo tradicional do UART" adiciona um pouco.