Как UART узнает разницу между битами данных и стартовыми/стоповыми битами? [дубликат]

Я понимаю, что схема UART обычно использует 8N1, что означает 1 стартовый бит, 8 битов данных и 1 стоповый бит. Что-то вроде этого:

0 хххххххх 1

Где 0 — стартовый бит, x — данные, а 1 — стоповый бит. В случае непрерывной отправки нескольких кадров друг за другом у вас будет что-то вроде этого:

0 ххххххх 10 хххххххх 10 хххххххх 1

Мой вопрос: как приемник может определить разницу между стартовыми/стоповыми битами и битами данных? Чтобы проиллюстрировать это, предположим, что байт данных 0xAA повторяется снова и снова. Это будет выглядеть так:

0 10101010 10 10101010 10 10101010 10 10101010 10 10101010 1

Я сделал стартовые/стоповые биты жирными для акцента, но мне кажется, что на самом деле нет никакого способа отличить их от битов данных.

Конечно, если приемник имеет надежное безошибочное соединение с передатчиком с незапамятных времен, то я понимаю, что это не будет проблемой. Или, если байты не отправляются друг за другом, это не будет проблемой. Но я работал со схемами 8N1, которые непрерывно передавали байты один за другим, и я мог отключить/переподключить провода в середине передачи, и приемник всегда возвращался к правильному приему. Как это возможно?

Это невозможно, и в таком непрерывном потоке у вас будут проблемы. Необходима либо задержка между байтами, либо какой-либо другой метод «кадрирования» байтов.
для UART очень легко синхронизироваться неправильно и какое-то время оставаться неправильным, есть шаблоны, которые вы можете отправлять непрерывно, и если он заблокируется неправильно, он останется неправильным. В идеале данные изменяются, и иногда бывают периоды простоя, в такой ситуации UART в конечном итоге будет работать с ошибками кадрирования блокировки данных вместо синхронизации, а затем в конечном итоге перейдет к правильному шаблону. Это далеко не идеальный протокол, но работает достаточно хорошо. Есть много других, которые не так подвержены ошибкам.
Он работает так, как вы ожидаете, и как следует из общего резюме большинства ответов. Предположим, что проверка на четность отсутствует, 1 start , 1 top, 8-битные данные. RX простаивает и готов к приему, линия = высокий = бездействует. | RX начнется с 1-го числа 0.| 1,5 бита после изменения 1/0 он будет выбирать 1-й бит и будет делать это 8 раз. | Затем через 1 бит будет произведена выборка стопового бита. -> СЕЙЧАС, если стоповый бит = 1 = действителен, он будет ждать следующего перехода 1/0 (правильно >= 1 бит времени после начала действительного стопового бита И если данные, полученные таким образом, являются мусором, он не знает. Это выглядит как настоящий....
... подлинные данные. Таким образом, он будет повторять вышесказанное. | Но / и если стоповый бит недействителен (низкий), он будет ЗНАТЬ, что он не синхронизирован, и отбрасывает be и ищет действительный стартовый бит. могут быть приняты решения о том, КОГДА может появиться действительный стартовый бит. | Для следующего кажущегося начального бита это повторяется, как описано выше. Если результатом является строка o данных с 10 последовательностями, разнесенными на 10 бит (как на вашей диаграмме) выше, то она синхронизирована, и данные действительны - насколько можно сказать. это МОЖЕТ быть мусором, но это мусор, напоминающий реальные данные. ...
| Каждый раз, когда несинхронизированная система видит низкий (= недействительный) стоп, но она пропускает один или несколько битов вдоль сильного, и ЕСЛИ данные действительно достоверны и безошибочны, она рано или поздно зафиксируется, если в данных нет шаблонов. которые соответствуют условию синхронизации 10xxxxxxxx. | Простые промежутки высокого уровня между персонажами очень помогут восстановить синхронизацию систем. Все высокие для 9? время символов гарантирует синхронизацию в безотказной системе.

Ответы (5)

Это звучит как вопрос, исходящий от кого-то, кто пытается эмулировать приемник UART в программном обеспечении или FPGA. Для RS-232 используются термины метка и пробел . Но после оцифровки они обычно соответствуют «1» и «0» соответственно.

Приемник UART часто делит каждое битовое время (должно быть известно априори) как минимум на 4, но часто на 16 или более подпериодов. Он запускается (при включении питания/сбросе) в состоянии, в котором ожидается, что линия последовательного приемника находится в состоянии метки . Если линия в этот момент НЕ находится в метке , то она знает , что находится в середине кадра передачи, и должна ждать, пока не сможет синхронизироваться. Если линия находится в состоянии метки , то она может или не можетбыть в середине чего-то и придется подождать и посмотреть. Это проблема с RS-232, если просто подключиться к другому устройству во время последовательной связи или если часть касания для мониторинга асинхронной последовательной связи между двумя другими плеерами и только что была сброшена. Чтобы быть абсолютно уверенным, в любом случае при выходе из сброса UART должен будет наблюдать как минимум N битовых времен (где N - количество битов в слове, а часто 7 или 8, и здесь не предполагается параметр четности), достойный отметки за которым следует один бит пространства для повторной синхронизации (или N+1 бит пространства.) Многие не переносят столько состояний, поэтому они могут неправильно синхронизироваться, если запущены в середине потока. Вы часто будете получать ошибки кадрирования и случайные байты данных, пока не случится случайная повторная синхронизация снова правильно. Это также часто была приемлемой ценой. Обычно кабели подключаются, а устройства включаются в определенном порядке, поэтому проблемы возникают редко.

Однако после синхронизации UART знает, чего ожидать. Он всегда начинается с линии приемника, идущей от метки к пробелу , необходимого начального бита, который идет в течение полного битового времени, за которым следуют биты данных, а затем следует по крайней мере один битовый интервал метки (или дольше) в качестве остановки. кусочек. Если он останется синхронизированным, то он увидит, что этот шаблон повторяется снова и снова.

Частично причина уменьшения битового времени до чего-то вроде 4X или 16X заключается в том, что часы, используемые передатчиком и приемником, не обязательно идеально точны, и в остальном они просто асинхронны друг с другом. Таким образом, часть синхронизации, которая происходит в приемнике, заключается в выравнивании его нарезанных кубиками периодов с синхронизацией передатчика. Чем мельче это сделано, тем лучше может быть выровнен приемник.

Он определяет стартовый бит. Именно в этом его цель. Строка бездействия будет выглядеть так:

...1111111111111111111111111111111...

Как только приемник видит 0после длительного времени единиц (или после стопового бита, как мы скоро увидим), он знает, что передача началась и начинает считать биты. Он знает, что 8биты (или как определено конфигурацией) после стартового бита являются данными. Девятый является стоповым битом и должен быть 1. Если это не так - возникает ошибка кадрирования и требуется повторная синхронизация.

После получения стопового бита он снова начинает ждать стартового бита. И так далее.

Теоретически могут быть проблемы с синхронизацией, если строка выглядит так:

..1010101010101010101.... 

или подобное, так что в этом случае получатель не увидит, где начать, но в этом случае это не будет иметь большого значения, так как начальная позиция не будет иметь никакого значения. Но во избежание таких проблем некоторые протоколы определяют длину стопового бита в 1,5 (полтора) бита, чтобы сделать его уникальным. Или, на практике, между двумя пакетами данных всегда есть некоторая временная задержка, поэтому линия простаивает достаточно долго, чтобы приемник мог синхронизироваться.

«но в данном случае это не будет иметь особого значения, так как начальная позиция не будет иметь никакого значения» — это будет иметь значение, когда линия остановит серию AAs и начнет передавать другие данные. Тогда приемник может получить не только ошибки кадрирования, но и мусорные данные.

UART нуждается в тишине в начале, чтобы поймать первый стартовый бит. Затем он просто считает в соответствии с предопределенным количеством битов, достигает стоп-бита и снова ждет стартового бита. Если UART начинает получать в середине длинного сообщения, оно легко может стать просто мусором.

Он может определить разницу, потому что знает, где они должны быть в битовом потоке (потому что вы сказали ему).

Просто помните, что любой символ не имеет смысла, пока не существует согласованного значения.

Если бездействие уже существует, ошибок не возникает, нет проблем, но любая ошибка, такая как переполнение буфера, требует некоторого метода подтверждения, после чего возникает состояние бездействия, и оно должно снова синхронизироваться с 1-го стартового бита.

Квитирование необходимо для сообщения об обнаружении заполнения буфера, переполнения, ошибки четности или ошибки стопового бита.

Нечетная четность полезна здесь для обнаружения ошибки данных и/или ошибки кадра, чтобы возобновить правильную синхронизацию начального бита и безошибочную связь.