Как избежать путаницы между отсутствием ввода и нулем в двоичном коде?

10

Предположим, я передаю данные через FM, где 0 - 2 Гц, а 1 - 4 Гц. Передатчик передает 2 Гц, когда нет входа. Если бы я передавал полученный двоичный файл в порт UART микроконтроллера, как бы микроконтроллер различал отсутствие данных и 0?

Это становится актуальным, например, при передаче символов ASCII. Предположим, следующая строка:

01000110 01101111 01101111 01100010 01100001 01110010

Поскольку я добавил пробелы, мы могли бы перевести это на:

Foobar

Но для машины строка будет выглядеть так:

010001100110111101101111011000100110000101110010

Как бы вы создали эти «пробелы», чтобы не допустить путаницы символов ASCII при получении двоичного кода?

Allenph
источник
5
Вот как это решает UART, ссылка . Остановите и запустите биты, так как zou подает их на порт UART, вы также должны передавать их.
Бенс Кауликс
Боюсь, я не совсем понимаю вашу схему. Похоже, что «Стартовый бит» просто нулевой, что подтверждает мою проблему. Например, как он узнает разницу между 01111000 и 00111100, если строка будет 000 01111000 000?
Алленф
2
@Allenph, когда вы не отправляете, шина простаивает и находится в логически высоком состоянии. Когда вы начинаете передачу пакета, первый бит всегда логически низок. Это стартовый бит. Затем следует восемь битов данных и затем стоповый бит, который является логически высоким. Микропроцессор знает, когда поступает следующий бит, поскольку он знает скорость шины, которую вы настроили. И микропроцессор, и блок, передающий на микропроцессор, должны быть настроены на одну и ту же скорость передачи.
Маттиас Йоханссон

Ответы:

16

Если вы что-то подаете на порт UART микропроцессора, вы должны следовать протоколу связи UART, если вы хотите, чтобы микропроцессор понял, что вы им подаете. Вам необходимо встроить каждый символ ASCI в пакет UART, который содержит стартовый бит, стоповый бит и, возможно, бит четности . На странице Википедии UART доступно гораздо больше информации .

Когда вы не отправляете, шина простаивает и находится в логически высоком состоянии. Когда вы начинаете передачу пакета, первый бит всегда логически низок. Это стартовый бит. Затем следует восемь битов данных и затем стоповый бит, который является логически высоким. Микропроцессор знает, когда поступает следующий бит, поскольку он знает скорость шины, которую вы настроили. Следовательно, можно передавать, например, два нуля рядом друг с другом. И микропроцессор, и блок, передающий на микропроцессор, должны быть настроены с одинаковой скоростью передачи, четностью и количеством стоп-битов.

Маттиас Йоханссон
источник
2
Ключевым моментом является то, что настроенное количество стоп-битов является минимумом, а не максимумом. Состояние ожидания асинхронной последовательной линии является расширенным стоповым битом. Таким образом, если радиостанция должна бездействовать в 0, то простой ответ - инвертировать выход UART перед тем, как включить радиостанцию ​​с ним, чтобы он работал на холостом ходу в 0, а 1 - начало. Затем инвертируйте полученные данные, прежде чем обрабатывать их с помощью UART.
RBerteig
6

Есть много методов для этого. Вы можете посмотреть на манчестерское кодирование или коды NRZ. Или кодирование 8b / 10b , которое отображает каждые 8 ​​битов данных в 10-битную последовательность, которая обеспечивает восстановление тактового сигнала, исправление ошибок и специальные символы «запятая», которые можно использовать для обнаружения начала и конца передачи.

pjc50
источник
5

Все символы ASCII имеют ширину 8 бит, вы можете увидеть это в таблице ASCII. HEX значения символов ASCII не выходят за пределы FF (1111 1111)

UART не может принимать более одного байта данных (8 бит) одновременно, кроме этих 8-битных данных есть биты STOP и START, PARITY и еще несколько, которые вы можете видеть на рисунке ниже и которые вместе образуют пакет связи UART.

введите описание изображения здесь

Поэтому, когда вы отправляете символы ASCII в UART, вы отправляете их один за другим, и вот как создается строка. Вы уже знаете, что строка это просто массив символов.

нищий
источник
4
ascii 7-битный, а не 8-й, однако обычно его помещают в 8-битный фрагмент, чтобы выравнивание было тривиальным. Это также позволяет другие наборы символов и utf8.
Hildred
0

Протокол UART, как объяснил Маттиас, является асинхронным протоколом, основанным на времени. То, что определяет границы между битами, - это время, прошедшее с начала начального бита. Таким образом, микроконтроллер «сэмплирует» битовые (N+half)/baudrateсекунды после начала стартового бита. Полубит предназначен только для выборки в середине битов, поэтому он может иметь полубитовую разницу во времени между приемником и передатчиком (помните, что различия являются кумулятивными, и наихудший случай случается в последнем бите каждого кадра, который обычно равен но не всегда, 8-битная ширина, в зависимости от конфигурации). Ключом к тому, чтобы это работало, является наличие приемника и приемопередатчика с максимально возможной скоростью передачи данных.

Таким образом, микроконтроллер считает время между каждым битом, чтобы узнать, где находится каждый бит внутри кадра. Следующий персонаж перейдет в следующий кадр. Когда заканчивается каждый кадр, микроконтроллер начинает автоматически прослушивать следующий кадр, поэтому, когда приходит следующий стартовый бит, он уже знает, что должен начать новый кадр. Вот как символы разделены.

Кроме того, я добавлю, что вам на самом деле не нужны две частоты для передачи на UART-принимающий микроконтроллер. Вы можете использовать одну частоту в качестве OOK вместо двух частот в качестве FSK . Он имеет более высокую спектральную эффективность, и схемы намного проще, поскольку вам нужен только переключатель несущей волны в качестве передатчика и одночастотный детектор в качестве приемника, во многом как азбука Морзе. Не забывайте обычно использовать несущие с частотами, которые намного выше, чем скорость передачи данных, иначе более простые схемы не будут работать должным образом.

Ронан Пайшао
источник