Аппаратное управление последовательным потоком ESP32 и полная поддержка espressif/arduino-esp32
У меня похожая проблема. Я хочу использовать ESP32 с RS485. Я использовал Arduino, и это хорошо работает при назначении контактов, но, похоже, не позволяет полностью использовать UART.
Я вижу, что новые UART в ESP32 могут поддерживать управление направлением (RTS) вывода направления, и на самом деле есть аппаратный режим RS485. См. репозиторий, на котором основан пакет платы: https://github.com/espressif/arduino-esp32
Затем https://github.com/espressif/arduino-esp32/tree/ master/tools/sdk/include/драйвер/драйвер uart.h
Это показывает, что мы действительно можем иметь полное аппаратное управление потоком, поэтому больше не нужно угадывать задержки для управления линиями DIR или получать прерывания, когда буфер отправки пуст, чтобы знать, когда переключиться обратно на прием.
Я обнаружил, что с помощью диспетчера плат не все было установлено, поэтому я следовал некоторым руководствам о том, как установить их вручную. Плата либо вообще не отображается, либо я не могу сослаться на "uart.h".
Есть идеи или примеры? Спасибо, Отметить
@CrazyHorse605, 👍1
Обсуждение2 ответа
Ваш пример очень помог решить проблему правильного вождения RTS, большое спасибо!
Я обнаружил небольшую ошибку в примере кода, буфер данных выделяется в функции loop() вместо setup(), и в результате утечка памяти в конечном итоге заполнит всю доступную память.
Чао! Алессандро
Espressif и Arduino используют одинаковую нумерацию UART, и нет никаких скрытых свойств hardwareSerial, привязанных к этому экземпляру UART. Таким образом, можно выполнить обход и заменить экземпляр драйвера UART harwareSerial arduino на экземпляр uart espressif RS485. а затем используйте методы ардуино hardwareSerial
для связи с UART.
#include <Arduino.h>
#include <stdlib.h>
#include <stdint.h>
#include <stddef.h>
#include <driver/uart.h>
#define ECHO_UART_PORT UART_NUM_1
#define ECHO_TEST_TXD (25)
#define ECHO_TEST_RXD (26)
#define ECHO_TEST_RTS (27)
#define ECHO_TEST_CTS UART_PIN_NO_CHANGE
#define BUF_SIZE (127)
#define BAUD_RATE (9600)
#if ECHO_UART_PORT == UART_NUM_0
#define SERIAL_485 Serial
#error Serial is already committed elsewhere in this code
#elif ECHO_UART_PORT == UART_NUM_1
#define SERIAL_485 Serial1
#elif ECHO_UART_PORT == UART_NUM_2
#define SERIAL_485 Serial2
#endif
static const char *TAG = "RS485_ECHO_APP";
void setup() {
Serial.begin(115200); //использует UART_NUM_0
//настроить UART_NUM_2 для RS485
const uart_port_t uart_num = ECHO_UART_PORT;
uart_config_t uart_config = {
.baud_rate = BAUD_RATE,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
.rx_flow_ctrl_thresh = 122,
};
Serial.println("Start RS485 application test and configure UART.");
// запускаем последовательный порт ардуино
SERIAL_485.begin(BAUD_RATE);
SERIAL_485.setTimeout(1+(10000/BAUD_RATE) ); // 10000 — это 10 символов на байт * 1000 мс в секунду
// сбрасываем драйвер UART, установленный на Arduino!
// мы заменим его драйвером с поддержкой 485.
uart_driver_delete(uart_num);
// Настраиваем параметры UART
uart_param_config(uart_num, &uart_config);
Serial.println("UART set pins, mode and install driver.");
// Установить выводы UART1 (TX: IO23, RX: I022, RTS: IO18, CTS: IO19)
uart_set_pin(uart_num, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS);
// Устанавливаем драйвер UART (здесь нам не нужна очередь событий)
// В этом примере мы даже не используем буфер для отправки данных.
uart_driver_install(uart_num, BUF_SIZE * 2, 0, 0, NULL, 0);
// Установить полудуплексный режим RS485
uart_set_mode(uart_num, UART_MODE_RS485_HALF_DUPLEX);
ESP_LOGI(TAG, "UART start recieve loop.\r\n");
SERIAL_485.printf("Start RS485 UART test.\r\n");
}
- I2C связь между Arduino Uno и Nodemcu32-s (ESP32)
- Лучшая практика буферизации для непрерывной записи на SD-карту
- Связь Arduino Uno и ESP32 с использованием RS485
- Когда дело доходит до связи UART-RS485, в чем разница между модулем "MAX485" и модулем "HW-0519"?
- Не могу подключиться к плате ESP32 через последовательный порт
- Нужен пример того, как отправлять КОМАНДЫ AT на модуль SIm7000E GPS+LTE из ESP32 и читать эти ответы в последовательном мониторе
- Можно ли свободно использовать UART0 при подключении ESP32 s3 через USB (D+, D-)?
- ESP отправить строку в Arduino
У меня нет проблем, просто включив
driver/uart.h
и скопировав-вставить код из официального примера RS485 (https://github.com/espressif/esp-idf/blob/master/examples/peripherals/uart/ uart_echo_rs485/main/rs485_example.c). См. мой пример на https://pastebin.com/2PtWJvd6. Каково ваше точное сообщение об ошибке?, @Maximilian GerhardtТакже документация на https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/uart.html#overview-of-rs485-specific-communication-options и примеры документов https ://github.com/espressif/esp-idf/tree/master/examples/peripherals/uart/uart_echo_rs485., @Maximilian Gerhardt
Почему вы, ребята, задерживаете линию режиссуры? Просто
flush()
после отправки любых данных., @Majenko