Итак, на прошлой неделе я работал над получением сообщений UART, отправленных с STM32F407, и читал их на своем ноутбуке через безобразный кабель RS232-USB с использованием термита.
Я использовал STMCube для генерации кода и добавления к нему, прочитав соответствующие инструкции в верхней части файла "stm32f4xx_hal_uart.c" (и просмотрев множество видео и читая онлайн).
Я проверил переданное сообщение на осциллографе, и оно соответствует его представлению ASCII.
Например, я посылаю 'Q', который является 0101 0001, я получаю 'W', который является 0101 0111. Показание в области показывает:
Выход термитов для того же сигнала, который отображается на осциллографе.
Я подтвердил, что скорость передачи в бодах / четность / HWcontrol совпадают по термитам и в моем коде.
Чтобы получить правильный характер, я попытался понизить и увеличить скорость передачи данных.
Я пробовал разные наборы символов, чтобы попытаться найти шаблон, который приводит к отображению неправильных символов.
Кроме того, я пробовал другой терминал, например, на Putty или Teraterm.
1
символ с желтым фоном слева от трассы - это уровень 0 В), а затем импульсы ниже 0 В. Это не было бы верно для логического сигнала прямо от STM32, и, действительно, это не так. Посмотрев в нижний левый угол, вы установили канал 1 для связи по переменному току (это~
символ, который вы видите там). Сигнал действительно высокий на холостом ходу и пульсирующий до 0В. Используйте постоянное соединение для разумного представления этого сигнала.Ответы:
Вы пропустили главную деталь RS232. Уровни логики следующие:
Рисунок 1. Уровни сигнала RS232. Источник: Wikimedia Commons .
Для преобразования логики TTL (5 В) в RS232 требуется драйвер. Микросхемы, такие как MAX232, обеспечивают инверсию логического уровня и повышение напряжения.
Иногда можно «обмануть» и подать сигнал TTL на вход 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. Вариации могут зависеть от скорости и характеристик напряжения.
источник