Почему я не могу успешно отправлять сообщения через RS232?

9

Итак, на прошлой неделе я работал над получением сообщений UART, отправленных с STM32F407, и читал их на своем ноутбуке через безобразный кабель RS232-USB с использованием термита.

Я использовал STMCube для генерации кода и добавления к нему, прочитав соответствующие инструкции в верхней части файла "stm32f4xx_hal_uart.c" (и просмотрев множество видео и читая онлайн).

Я проверил переданное сообщение на осциллографе, и оно соответствует его представлению ASCII.

Например, я посылаю 'Q', который является 0101 0001, я получаю 'W', который является 0101 0111. Показание в области показывает:

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

Выход термитов для того же сигнала, который отображается на осциллографе. введите описание изображения здесь

Я подтвердил, что скорость передачи в бодах / четность / HWcontrol совпадают по термитам и в моем коде.

Чтобы получить правильный характер, я попытался понизить и увеличить скорость передачи данных.
Я пробовал разные наборы символов, чтобы попытаться найти шаблон, который приводит к отображению неправильных символов.
Кроме того, я пробовал другой терминал, например, на Putty или Teraterm.

FeraTaTa
источник
8
Работает ли ваш кабель «RS232 - USB» с уровнями напряжения RS232 или уровнями «TTL», и ваша плата STM32F407 использует подходящий драйвер / приемник для этих уровней? Я почти уверен, что ответ на вопрос 2 - «Нет», потому что, если я интерпретирую трассировку вашей области действия через фильтр «неправильные уровни и полярность», я тоже вижу букву «W». По всей вероятности, ваша плата не имеет аппаратного обеспечения драйвера / приемника (поэтому используются уровни TTL), а ваш «кабель RS232 - USB» имеет аппаратное обеспечение драйвера / приемника RS232 (поэтому используются уровни RS232).
Brhans
3
Попытка использовать несколько разных символов мгновенно подтвердила бы гипотезу @brhans. Посылка одного и того же персонажа снова и снова, ожидая другого результата, является одним из определений безумия ...
Дейв Твид
3
FeraTaTa - только одна точка, о которой я не думаю, была упомянута до сих пор: на первый взгляд, ваша кривая области видимости показывает сигнал, который кажется простаивающим при 0 В (посмотрите на 1символ с желтым фоном слева от трассы - это уровень 0 В), а затем импульсы ниже 0 В. Это не было бы верно для логического сигнала прямо от STM32, и, действительно, это не так. Посмотрев в нижний левый угол, вы установили канал 1 для связи по переменному току (это ~символ, который вы видите там). Сигнал действительно высокий на холостом ходу и пульсирующий до 0В. Используйте постоянное соединение для разумного представления этого сигнала.
СамГибсон

Ответы:

22

Вы пропустили главную деталь RS232. Уровни логики следующие:

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

Рисунок 1. Уровни сигнала RS232. Источник: Wikimedia Commons .

  • Логика 1 = от -3 до -12 В.
  • Логика 0 = от +3 до +12 В.
  • Между -3 и +3 логический уровень не определен.
  • Стартовый бит RS232 является логическим 0.

Для преобразования логики TTL (5 В) в RS232 требуется драйвер. Микросхемы, такие как MAX232, обеспечивают инверсию логического уровня и повышение напряжения.

Иногда можно «обмануть» и подать сигнал TTL на вход RS232, если логический уровень инвертирован. Надежность этого метода зависит от чипа, используемого на входе RS232.

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

Рисунок 2. Переданный сигнал. Сверху находится битовый паттерн 'Q', который вы передали. Внизу показано, как его читает вход RS232.

Обратите внимание, что вход RS232 ищет положительный фронт для указания начального бита. Это не происходит до тех пор, пока второй бит ваших данных не будет, поэтому все после этого будет на один бит вправо и инвертировано, как это видит получатель. Если повезет, ваш MSB является правильным логическим уровнем для стоп-бита, поэтому приемник интерпретировал его как действительный кадр, расшифровал его и отобразил букву «W».

В целях тестирования вы можете инвертировать ваш TTL-вывод. Это, вероятно, будет работать, поскольку это "работает" в данный момент.

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

Рисунок 3. Микросхема MAX232 использует конденсаторы в цепях подкачки заряда для повышения напряжения 5 В для уровней RS232.

Для надежности добавьте микросхему MAX232 для передачи и получения правильного сигнала уровня RS232.

транзистор
источник
3
В качестве лучшей альтернативы предлагаются кабели USB-TTL UART. Если OP все равно использует USB-адаптер, нет особого смысла добавлять дополнительную микросхему для сдвига уровня.
Грэм
1
RS-232 представляет собой логический 0 = биполярный V +, который равен чему-то> 2 В и эквивалентный порог TTL 1,5 В тип. в CMOS, как 74HCTxx с небольшим гистерезисом (50 мВ ??)
Тони Стюарт Sunnyskyguy EE75
6
На английском, пожалуйста, Тони?
Транзистор
3
Это английский для EE, какую часть вы не понимаете? RS232 равен -V на холостом ходу и> + 2V на старте, но имеет отрицательную логику для напряжения (0 = V +, 1 = V-) для данных и останавливается на V-. Бьюсь об заклад, вы не знали, порог RS-232 составляет 1,4 ~ 1,5 В
Тони Стюарт Sunnyskyguy EE75
8
Спасибо, Тони. Это гораздо более читабельно и разумно. Вы пропускаете знаки препинания, ключевые слова и конъюнктивы в слишком многих ваших быстрых ответах. Я такой же старик, как и ты, с почти четырьмя десятилетиями ЭЭ. Мой рисунок 1 показывает пороговые напряжения для приема. Смотрите также Omega , Analog , Wikipedia и Maxim . Все состояния ± 5 В для TX и ± 3 В для RX.
Транзистор
7

Учитывая короткую дальность и низкую скорость передачи 9600, уровни TTL и CMOS работают нормально. Проблема, красноречиво описанная @Transistor, заключается в том, что данные UART имеют отрицательную логику 0 ~ 5 В, а RS-232 имеет положительную логику +/- V f между +/- 3 и +/- 15 В (?)

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

Проблема не в частоте ошибок по битам (BER) или целостности сигнала, а в инвертированной логике.

Кроме того, «серая зона» предназначена для запаса шума на большие расстояния. Для вас это не <+/- 3 В , потому что у вас короткий кабель. Фактический логический порог RS-232 Rx точно такой же, как у старого TTL (два падения Vbe) или 1,4 В +/- 20% (?) Допуска.

Они называют его серой зоной, чтобы соответствовать всем характеристикам расстояния и скорости передачи из-за шумовых сбоев и звона краев.

Для более длинных кабелей возьмите любой MAX232. Вариации могут зависеть от скорости и характеристик напряжения.

Тони Стюарт Sunnyskyguy EE75
источник