Предположим, я передаю данные через FM, где 0 - 2 Гц, а 1 - 4 Гц. Передатчик передает 2 Гц, когда нет входа. Если бы я передавал полученный двоичный файл в порт UART микроконтроллера, как бы микроконтроллер различал отсутствие данных и 0?
Это становится актуальным, например, при передаче символов ASCII. Предположим, следующая строка:
01000110 01101111 01101111 01100010 01100001 01110010
Поскольку я добавил пробелы, мы могли бы перевести это на:
Foobar
Но для машины строка будет выглядеть так:
010001100110111101101111011000100110000101110010
Как бы вы создали эти «пробелы», чтобы не допустить путаницы символов ASCII при получении двоичного кода?
digital-logic
data
binary
Allenph
источник
источник
Ответы:
Если вы что-то подаете на порт UART микропроцессора, вы должны следовать протоколу связи UART, если вы хотите, чтобы микропроцессор понял, что вы им подаете. Вам необходимо встроить каждый символ ASCI в пакет UART, который содержит стартовый бит, стоповый бит и, возможно, бит четности . На странице Википедии UART доступно гораздо больше информации .
Когда вы не отправляете, шина простаивает и находится в логически высоком состоянии. Когда вы начинаете передачу пакета, первый бит всегда логически низок. Это стартовый бит. Затем следует восемь битов данных и затем стоповый бит, который является логически высоким. Микропроцессор знает, когда поступает следующий бит, поскольку он знает скорость шины, которую вы настроили. Следовательно, можно передавать, например, два нуля рядом друг с другом. И микропроцессор, и блок, передающий на микропроцессор, должны быть настроены с одинаковой скоростью передачи, четностью и количеством стоп-битов.
источник
Есть много методов для этого. Вы можете посмотреть на манчестерское кодирование или коды NRZ. Или кодирование 8b / 10b , которое отображает каждые 8 битов данных в 10-битную последовательность, которая обеспечивает восстановление тактового сигнала, исправление ошибок и специальные символы «запятая», которые можно использовать для обнаружения начала и конца передачи.
источник
Все символы ASCII имеют ширину 8 бит, вы можете увидеть это в таблице ASCII. HEX значения символов ASCII не выходят за пределы FF (1111 1111)
UART не может принимать более одного байта данных (8 бит) одновременно, кроме этих 8-битных данных есть биты STOP и START, PARITY и еще несколько, которые вы можете видеть на рисунке ниже и которые вместе образуют пакет связи UART.
Поэтому, когда вы отправляете символы ASCII в UART, вы отправляете их один за другим, и вот как создается строка. Вы уже знаете, что строка это просто массив символов.
источник
Протокол UART, как объяснил Маттиас, является асинхронным протоколом, основанным на времени. То, что определяет границы между битами, - это время, прошедшее с начала начального бита. Таким образом, микроконтроллер «сэмплирует» битовые
(N+half)/baudrate
секунды после начала стартового бита. Полубит предназначен только для выборки в середине битов, поэтому он может иметь полубитовую разницу во времени между приемником и передатчиком (помните, что различия являются кумулятивными, и наихудший случай случается в последнем бите каждого кадра, который обычно равен но не всегда, 8-битная ширина, в зависимости от конфигурации). Ключом к тому, чтобы это работало, является наличие приемника и приемопередатчика с максимально возможной скоростью передачи данных.Таким образом, микроконтроллер считает время между каждым битом, чтобы узнать, где находится каждый бит внутри кадра. Следующий персонаж перейдет в следующий кадр. Когда заканчивается каждый кадр, микроконтроллер начинает автоматически прослушивать следующий кадр, поэтому, когда приходит следующий стартовый бит, он уже знает, что должен начать новый кадр. Вот как символы разделены.
Кроме того, я добавлю, что вам на самом деле не нужны две частоты для передачи на UART-принимающий микроконтроллер. Вы можете использовать одну частоту в качестве OOK вместо двух частот в качестве FSK . Он имеет более высокую спектральную эффективность, и схемы намного проще, поскольку вам нужен только переключатель несущей волны в качестве передатчика и одночастотный детектор в качестве приемника, во многом как азбука Морзе. Не забывайте обычно использовать несущие с частотами, которые намного выше, чем скорость передачи данных, иначе более простые схемы не будут работать должным образом.
источник