Существует несколько потенциальных источников шума в любой цепи. Некоторые из наиболее распространенных включают в себя:
- Плохо регулируемые источники питания;
- Импульсные источники питания;
- Недостаточная емкостная развязка силовых шин рядом с микроконтроллером;
- Индуктивная связь соседних электромагнитных источников (в том числе 50 или 60 Гц от источника питания; даже если цепь питается от батареи, она будет испытывать эти помехи, когда достаточно близко к источнику питания);
- Источники РЧ вблизи резонансной частоты следа на плате или одной из его гармоник;
- Прокладка сильноточных трасс на плате возле сигнальных линий;
- И т.п.
Кроме того (как упомянуто @jippie), искажение тактовой частоты является очень распространенной причиной ошибок в любом типе последовательной связи, которая использует заранее определенную скорость передачи данных. Если вы используете внешний кристалл и взаимодействуете с другой системой, которая, как можно разумно ожидать, будет точной, это вряд ли вызовет проблемы. Внутренние осцилляторы, однако, могут иметь допуски, которые на несколько порядков хуже, чем у кристаллов, и имеют тенденцию к большему изменению в температурных диапазонах.
Есть несколько основных тестов, которые можно выполнить на работающей системе, чтобы определить базовую помехоустойчивость (и асимметрию) вашего интерфейса, включая:
- Замораживание (охлаждение контура до минимального номинала его компонентов);
- Выпечка (нагрев до максимальной оценки);
- Воздействие EMI :
- Установите плату поверх шнура питания обогревателя;
- Введите радио CB в непосредственной близости от платы;
- Поместите плату рядом с вашим беспроводным маршрутизатором;
- Используйте длинный соединительный провод (вместо правильно построенного последовательного кабеля) для соединения UART.
Есть много других - на самом деле, есть большие испытательные лаборатории, посвященные квалификации EMC .
В целом, если какой-либо минимальный уровень потери данных не является приемлемым, всегда целесообразно включить какую-либо проверку ошибок в код связи. Даже простая контрольная сумма лучше, чем ничего.
Большинство ошибок проистекают из трех причин: (1) сгенерированный сигналом передатчик не соответствует действительным данным; (2) сигнал передатчика не был получен как сгенерированный, или (3) приемник не был готов обрабатывать данные, когда они были получены. Самая распространенная причина, по которой я столкнулся с проблемой № 1, - это передатчик, который переконфигурируется или отключается во время передачи данных. Проблема № 2 может легко возникнуть для сигналов, проходящих через «внешний мир», в результате радиопомех (мобильные телефоны могут быть на удивление неприятными!), Но, как правило, не должна возникать для сигналов, ограниченных одной платой. Проблема № 3 может возникать из-за того, что слишком много байтов поступает быстрее, чем они могут быть обработаны, или из-за того, что приемник реконфигурирован, выключен или запущен во время передачи.
Во многих случаях трудно полностью устранить все эти проблемы; цель должна состоять в том, чтобы гарантировать, что общий «ущерб», нанесенный ими (вероятность возникновения, количество повреждений на случай), является приемлемо низким. Это легче всего сделать, выбрав пессимистическую оценку надежности, а затем разработав протокол так, чтобы влияние на производительность системы даже самых худших отказов, которые соответствовали оценкам, находилось в допустимых пределах.
источник
Ошибки кадрирования могут быть вызваны тем, что упоминает @jippie - приемник обнаружил стартовый бит и там, где он ожидает стоповый бит, данные инвертируются. Это также может быть связано с повреждением данных, вызванным помехами в линии, возникающими в стоп-бите. Вы всегда должны проверять это для каждого полученного байта.
Ошибки четности возникают, когда четность реализована в канале данных, и существует повреждение, которое вызывает несоответствие четности в полученных данных. Вы всегда должны проверять это для каждого полученного байта.
Прерывание приема также рассматривается как ошибка, хотя на самом деле это признак того, что входящие данные упали до логического нуля для данных длиннее 1 байта. Обычно логическое 1 - это «окружающее» состояние между последовательными байтами данных, и оно остается таким. Я думаю, это возврат к старым телеграфным системам. Я бы не стал проверять это, если бы вы не использовали эту «функцию», чтобы указать (скажем) команду сброса для получателя.
Ошибка переполнения - это когда новый байт получен до того, как процессор прочитал предыдущий байт. Немного отличается, когда задействован FIFO, но это одно и то же - действительные полученные данные теряются из-за медленной работы процессора. Всегда проверяйте это перед чтением байта, и если байт является частью более длинного сообщения (или команды), отбросьте все сообщение / команду и каким-то образом попросите передатчик повторно отправить все сообщение / команду.
Недостаточное выполнение на самом деле не является ошибкой, но указывает отправляющему UART, что его буфер передачи пуст, т.е. он запрашивает новый байт для передачи. Вам не нужно проверять это.
источник
Чтобы справиться с этими ошибками, вы должны реализовать логический протокол более высокого уровня. что-то похожее на TCP, или проверьте стек OSI для идей.
в основном, две важные части для начала - это контрольные суммы и тайм-ауты. используйте алгоритм для вычисления избыточного значения, которое представляет в меньшей форме содержимое каждого сообщения. затем проверьте это в полученном сообщении. если суммы не совпадают, возможно, вы получили ошибку кадрирования, битовый шум и т. д., и т. д., и вам нужно будет отбросить сообщение и попытаться каким-либо образом восстановить, повторно отправить, сигнал NACK (не подтвержденный) и т. д.
также убедитесь, что тайм-ауты включены в протокол верхнего уровня. если вы получаете какую-то ошибку кадрирования, ваш UART может никогда не восстановиться и снова начать обработку. возможно, он ожидает стоп-бит на кадре, который, как считает отправитель UART, уже отправлен, но был искажен шумом, перекосом тактового сигнала и т. д., что приведет к отправке любого входного кода в бесконечный цикл. убедитесь, что у вас есть разумный предел того, как долго ваши входные данные должны ждать, пока вы не решите отказаться от этого сообщения, и снова повторить попытку, NACK, отказаться и т. д.
источник