Аппаратное управление последовательным потоком 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".

Есть идеи или примеры? Спасибо, Отметить

, 👍1

Обсуждение

У меня нет проблем, просто включив 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


2 ответа


1

Ваш пример очень помог решить проблему правильного вождения RTS, большое спасибо!

Я обнаружил небольшую ошибку в примере кода, буфер данных выделяется в функции loop() вместо setup(), и в результате утечка памяти в конечном итоге заполнит всю доступную память.

Чао! Алессандро

,

0

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");
}
,