Итак, на прошлой неделе я работал над получением сообщений UART, отправленных с STM32F407, и чтением их на моем ноутбуке через ugreen кабель RS232-USB с использованием термита.
Я использовал STMCube для создания кода и добавления его, прочитав соответствующие инструкции в верхней части файла «stm32f4xx_hal_uart.c» (а также просматривая множество видео и читая в Интернете).
Я проверил переданное сообщение на осциллографе, и оно соответствует его ASCII-представлению.
Например, я отправляю «Q», что равно 0101 0001, я получаю «W», что равно 0101 0111. Показания на осциллографе показывают:
Выход термита для того же сигнала, что и на осциллографе.
Я подтвердил, что скорость передачи/четность/HWcontrol совпадают на термитах и в моем коде.
Чтобы получить правильный символ, я пробовал уменьшать и увеличивать скорость передачи данных.
Я пробовал разные наборы символов, чтобы попытаться найти шаблон, который приводит к отображению неправильных символов.
Кроме того, я пробовал разные терминалы, такие как Putty или Teraterm.
Вы упустили важную деталь RS232. Логические уровни следующие:
Рисунок 1. Уровни сигналов RS232. Источник: Викисклад .
Для преобразования логики TTL (5 В) в RS232 требуется драйвер. Такие микросхемы, как MAX232, выполняют инвертирование логического уровня и повышение напряжения за вас.
Иногда можно «схитрить» и подать ТТЛ-сигнал на вход RS232 при условии инвертирования логического уровня. Надежность этого метода зависит от чипа, используемого на входе RS232.
Рисунок 2. Форма переданного сигнала. Сверху находится битовая комбинация «Q», которую вы передали. Внизу показано, как читается вход RS232.
Обратите внимание, что вход RS232 ищет положительный фронт для указания стартового бита. Этого не произойдет до второго бита ваших данных, поэтому все после этого будет на один бит вправо и инвертировано, как это видит получатель. К счастью, ваш MSB является правильным логическим уровнем для стопового бита, поэтому приемник интерпретировал его как действительный кадр, декодировал его и отображал «W».
В целях тестирования вы можете инвертировать выход TTL. Это, вероятно, будет работать, поскольку оно «работает» в данный момент.
Рис. 3. Микросхема MAX232 использует конденсаторы в схемах подкачки заряда для повышения напряжения питания 5 В для уровней RS232.
Для надежности добавьте микросхему MAX232 для передачи и приема сигнала надлежащего уровня RS232.
Учитывая короткие расстояния и низкий битрейт 9600, уровни TTL и CMOS работают нормально. Проблема, красноречиво описанная @Transistor, заключается в том, что данные UART имеют отрицательную логику 0 ~ 5 В, а RS-232 — положительную логику +/-V f между +/-3 и +/-15 В (?)
Поэтому, как он также предполагает, инвертор будет работать.
Проблема заключается не в частоте ошибок по битам (BER) или целостности сигнала, а в инвертированной логике.
Кроме того, «серая зона» предназначена для запаса шума на больших расстояниях. Для вас это не <+/-3 В , потому что ваш кабель короткий. Фактический логический порог RS-232 Rx точно такой же, как у старого TTL (два падения Vbe) или допуск 1,4 В +/- 20% (?).
Они называют это серой зоной, чтобы соответствовать всем спецификациям по расстоянию и скорости передачи из-за шумовых сбоев и краевого звона.
Для более длинных кабелей возьмите любой MAX232. Изменения могут зависеть от скорости напряжения и характеристик.
браханы
Дэйв Твид
Сэм Гибсон
1
символ с желтым фоном слева от трассы - это уровень 0 В), а затем пульсирует ниже 0 В. Это было бы неверно для логического сигнала прямо от STM32, да это и неправда. Глядя в нижний левый угол, вы установили канал 1 на связь по переменному току (это~
символ, который вы там видите). Сигнал на холостом ходу действительно высок и пульсирует примерно до 0 В. Используйте связь по постоянному току для нормального представления этого сигнала.