Возникли проблемы с подключением RS232 UART к физическому соединению с ПК.

TL;DR: Попытка подключить UART2 на ESP32-WROOM к физическому ПК RS232 приводит к странному поведению, а также к сбоям или ошибкам ESP32. Подозрение на проблемы с электрической конструкцией. Интересно, нужно ли мне уделять особое внимание напряжениям или диодам, чтобы избежать обратной связи с разъемами GPIO на стороне ESP.


Привет! Я относительно новичок в сообществе. Я пытаюсь создать инструмент, который будет взаимодействовать с мостом видеоконференции через его последовательный порт для автоматизации помещений (отключение/включение звука/ответ/raise_blinds/dim_lights/и т. д.). Поскольку интерфейс моста является последовательным, я хочу иметь два пригодных для использования порта RS232. Один для взаимодействия с мостом, а другой для работы в качестве консоли для устранения неполадок и настройки.

Я купил несколько комплектов ESP32-WROOM и собрал значительную часть остального инструмента, но сейчас я пытаюсь заставить UART2 взаимодействовать с моим физическим последовательным портом на моем ПК, чтобы я мог устранить неполадки в реальном мостовые взаимодействия. Я создал тестовый эскиз, который просто отправляет сообщение «Привет!» каждую секунду или около того на UART2 и отображает все, что он получает на UART2, обратно на UART0. Для UART0 установлено значение 115200, а для UART2 установлено значение 9600. Я изменил это значение, чтобы оно соответствовало, и это не имело никакого значения.

Конфигурация:

  • UART0 — 115200,8N1 на стандартной USB-консоли.
  • UART2 имеет значение 9600,8N1 на GPIO по умолчанию 17/18 (TX2/RX2).
  • Контакты 17/18 и земля подключаются к 8-портовому однорядному разъему, который затем подключается к коммутационной плате Teansic RJ45.
  • Использование последовательного монитора Arduino IDE для наблюдения. На моем компьютере отображается как COM3.
  • UART2 подключен к адаптеру StarTech USB-RJ45, созданному специально для консолей Cisco (ICUSBROLLOVR), он отображается как COM7, и я просто использую Putty для наблюдения.

Эскиз:

#include <HardwareSerial.h>

#define RXD2 16
#define TXD2 17
#define Serial0 Serial
#define Serial2 SerialPort

HardwareSerial Serial2(2);

void setup() {
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
  Serial0.begin(115200);
}

void loop() {
  while (Serial2.available()) {
    Serial0.printf("[%012d]      In: ", esp_timer_get_time());
    //Serial0.print(char(Serial2.read()));
    Serial0.print(Serial2.readStringUntil('\n'));
    Serial0.print("\n");
  }
  while (Serial0.available()) {
    Serial2.printf("\n[%012d]  Insert: ", esp_timer_get_time());
    //Serial0.print(char(Serial2.read()));
    Serial2.print(Serial0.readStringUntil('\n'));
    Serial2.print("\n");
  }
  Serial0.printf("[%012d]     Out: ", esp_timer_get_time());
  Serial0.print("Hello!\n");
  Serial2.print("Hello!\n");
  delay(1100);

}

Поведение:

Когда я подключаю свой компьютер, он получает символы, но они представляют собой (постоянный) мусор примерно с нужным количеством символов. Это выглядит так:


▒::
   ▒[▒::
        ▒[▒::
             ▒[▒::
                  ▒[▒::
                       ▒

Иногда я получаю фантомные символы с ПК, хотя ничего не отправляю.

Если я замкну UART2 обратно на себя (подключу TX к RX на моем последовательном разъеме), я получу идеальный ответ на обратном выходе UART0, как если бы входной сигнал поступал с ПК.

Если я отправлю данные с ПК на UART2, это приведет к сбоям/ошибкам, подобным следующим. Ошибка подразумевает, что происходит перезагрузка, но это не так:

rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1344
load:0x40078000,len:13964
load:0x40080400,len:3600
entry 0x400805f0
[000000011533]     Out: Hello!
[000001111758]      In: 
[000002111056]     Out: Hello!

Я наблюдал за электрическим выходным сигналом с помощью осциллографа, и он выглядел как хороший сигнал RS232. Я зашел так далеко, что преобразовал свою символьную строку в двоичный код с прямым порядком байтов и добавил начальный и стоповый биты, и для меня это выглядит точно так, как и должно быть, за исключением того, что я ожидаю, что 0 и 1 должны находиться в диапазоне от -3 до -10. и от +3 до +10, вместо этого шаблон выглядит примерно +400 мВ для 1 и марковых битов и чуть выше нуля для 0 (относительно земли).

Я нашел очень мало ссылок на подключение RS232 к реальному ПК. Почти все выглядит как соединение логического уровня между ESP32 и ESP32 или периферийной платой с ESP32.

Я подозреваю, что здесь требуется схема для преобразования напряжений логического уровня во внешние диапазоны RS232 +10/-10 В и, возможно, диоды или что-то еще для предотвращения фантомной обратной связи, поскольку TX/RX имеют общее заземление, но я летать вслепую. Я надеюсь, что у кого-нибудь здесь есть опыт работы с этим и он сможет указать мне ответ или лучшие справочные материалы.

, 👍1


1 ответ


0

Думаю, я нашел ответ на свой вопрос, погуглив виджеты.

Существует множество комплектов, которые делают именно это, но Sparkfun любезно предоставил мне схему того, как именно их собрать.

Руководство по SparkFun

Я оставлю это здесь для других и все еще жду отзывов, но думаю, что у меня есть ответ.

Для меня не было очевидно (но должно было быть), что плата будет работать только с положительными сигналами низкого напряжения (TTL), а встроенный UART волшебным образом не преобразует их в инвертированные сигналы с более высоким напряжением.

р>
,