UART не является отказоустойчивым по своей природе - мы говорим здесь о технологиях 1960-х годов.
Корень проблемы в том, что UART синхронизируется только один раз на 10 битов, что позволяет много тарабарщины проходить между этими периодами синхронизации. В отличие, например, от CAN, который дискретизирует каждый отдельный бит несколько раз.
Любая двухбитовая ошибка, возникающая внутри данных, повредит кадр UART и пройдет незамеченным. Битовые ошибки в стартовых / стоповых битах могут обнаруживаться или не обнаруживаться в форме ошибок переполнения.
Следовательно, независимо от того, используете ли вы необработанные данные или пакеты, всегда существует вероятность того, что переворот в битах, вызванный EMI, приведет к неожиданным данным.
Существуют многочисленные способы «традиционного шарлатанства UART», чтобы хоть немного улучшить ситуацию. Вы можете добавить байты синхронизации, биты синхронизации, четность, биты двойного стопа. Вы можете добавить контрольные суммы, которые подсчитывают сумму всех байтов (а затем инвертировать ее - потому что почему бы нет), или вы можете посчитать количество двоичных единиц в качестве контрольной суммы. Все это широко используется, крайне ненаучно и с большой вероятностью пропущенных ошибок. Но это было то, что люди делали с 1960-х по 1990-е годы, и многие странные вещи, подобные этим, происходят сегодня.
Наиболее профессиональный способ обеспечения безопасной передачи по UART - наличие 16-битной контрольной суммы CRC в конце пакета. Все остальное не очень безопасно и имеет высокую вероятность пропущенных ошибок.
Тогда на аппаратном уровне вы можете использовать дифференциал RS-422 / RS-485, чтобы радикально улучшить надежность передачи. Это необходимо для безопасной передачи на большие расстояния. Уровень UART TTL должен использоваться только для связи на борту. RS-232 не должен использоваться для каких-либо других целей, кроме обратной совместимости со старым материалом.
В целом, чем ближе к оборудованию механизм обнаружения ошибок, тем эффективнее он работает. С точки зрения эффективности, дифференциальные сигналы добавляют больше всего, с последующей проверкой ошибок кадрирования / переполнения и т. Д. CRC16 добавляет немного, а затем добавляет «традиционное шарлатанство UART».