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

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

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

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

Например, я отправляю «Q», что равно 0101 0001, я получаю «W», что равно 0101 0111. Показания на осциллографе показывают:

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

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

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

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

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

Ответы (2)

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

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

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

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

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

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

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

Рисунок 2. Форма переданного сигнала. Сверху находится битовая комбинация «Q», которую вы передали. Внизу показано, как читается вход RS232.

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

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

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

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

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

Все хорошо... Имейте в виду, что есть много чипов "типа MAX232" на выбор. Даже от других производителей. Просмотрите варианты и выберите тот, который лучше всего подходит для вашего проекта.
В качестве, возможно, лучшей альтернативы доступны кабели USB-TTL UART. Если в любом случае OP использует USB-адаптер, нет особого смысла добавлять дополнительный чип для переключения уровней.
RS-232 представляет собой логический 0 = биполярный V+, который соответствует любому значению > 2 В и эквивалентному TTL порогу 1,5 В тип. в КМОП типа 74HCTxx с малым гистерезисом (50мВ??)
На английском, пожалуйста, Тони?
Это английский для EE, какую часть вы не понимаете? RS232 имеет -V в режиме ожидания и >+2V при запуске, но имеет отрицательную логику по отношению к напряжению (0=V+, 1=V-) для данных и останавливается на V-. Бьюсь об заклад, вы не знали, что порог RS-232 составляет 1,4 ~ 1,5 В.
Спасибо, Тони. Это намного читабельнее и разумнее. Вы пропускаете знаки препинания, ключевые слова и союзы во многих своих быстрых ответах. Я такой же старик, как и ты, с почти сорока годами ЭЭ. На моем рисунке 1 показаны пороговые напряжения для RX. См. также Омега , Аналог , Википедия и Максим . Все состояния ±5 В для TX и ±3 В для RX.
@ Грэм, использование кабеля UART USB-to-TTL было бы более логичным, поскольку USB имеет только 0 В / 5 В, поэтому кабелю также не понадобится этот дополнительный переключатель уровня.
@Transistor Они всегда говорят о безопасных запасах для ВСЕЙ логики, но из опыта разработки тестов я знаю, что точные пороги для TTL и RS232 одинаковы. 1,4~1,5 + допуск по темп. И кстати спасибо за исправления синтаксиса

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

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

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

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

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

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