Возникли проблемы с подключением 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 имеют общее заземление, но я летать вслепую. Я надеюсь, что у кого-нибудь здесь есть опыт работы с этим и он сможет указать мне ответ или лучшие справочные материалы.
@Jason Rohm, 👍1
1 ответ
Думаю, я нашел ответ на свой вопрос, погуглив виджеты.
Существует множество комплектов, которые делают именно это, но Sparkfun любезно предоставил мне схему того, как именно их собрать.
Руководство по SparkFun
Я оставлю это здесь для других и все еще жду отзывов, но думаю, что у меня есть ответ.
Для меня не было очевидно (но должно было быть), что плата будет работать только с положительными сигналами низкого напряжения (TTL), а встроенный UART волшебным образом не преобразует их в инвертированные сигналы с более высоким напряжением.
р>- Потеря данных при последовательном считывании с помощью Arduino Nano
- Ошибка возврата сверхбыстрой передачи UART
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Как использовать Serial.setTimeout()
- Отправка последовательных данных в прерывании
- Отправить структуру через Serial
- Почему люди используют 115200 вместо 9600?