Нужен ESP32 для использования 3 последовательных портов

У меня есть проект, для которого требуется 3 последовательных порта на моем 38-контактном микроконтроллере ESP32 Dev. Два из них предназначены для сенсорных дисплеев Nextion, а другой — для GPS. Насколько я понимаю, проблема в том, что ESP32 имеет 3 аппаратных последовательных порта, из которых можно использовать только 2. GPIO 1 и 3 не могут быть подключены к дисплею во время загрузки, а Software Serial в Arduino IDE 2.0.4 несовместим с ESP32. Кто-нибудь может сказать мне, как я могу использовать 3 последовательных порта?

Спасибо

, 👍2

Обсуждение

используйте ota для загрузки скетчей, в любом случае это быстрее, безопаснее и гибче. вы также можете использовать software serial, mos def., @dandavis

Любой из выводов последовательного порта ESP32 легко переназначить на другие выводы, поэтому вы не привязаны к стандартной распиновке., @StarCat

Добро пожаловать, Ричард, ваш вопрос интересен и является распространенной проблемой на арене Arduino. Я просто использую плату SPI или I2C, которая выводит RS232. Я наткнулся на них несколько лет назад и использовал несколько, они отлично сработали. Я не помню, как они назывались, но вот ссылка на один из многих доступных: «https://andino.systems/extensions/rs232». Это был первый поисковый запрос, который я использовал: модуль arduino SPI to RS232». Вот еще одна ссылка на Pi: "https://forums.raspberrypi.com//viewtopic.php?t=146908&p=1083915#p1024636", @Gil

Не полный ответ, но, в зависимости от модели вашего GPS, вместо этого вы можете использовать I2C., @dda


3 ответа


-1

Добро пожаловать, Ричард! Ваш вопрос интересен и является распространенной проблемой на арене Arduino. Я просто использую плату SPI или I2C, которая выводит RS232. Я наткнулся на них несколько лет назад и использовал несколько, они отлично работали. Я не помню, как они назывались, но вот ссылка на одну из множества доступных: "https://andino.systems/extensions/rs232" Это был первый поисковый запрос, который я использовал: arduino SPI to RS232 module" ;. Вот еще одна ссылка на Pi: "https://forums.raspberrypi.com//viewtopic.php?t=146908&p=1083915#p1024636"

,

Гил, это не дискуссионный форум. Мы пишем ответ не для плаката, а для задачи. В поле для ответов помещайте только решения. Пожалуйста, пройдите тур https://arduino.stackexchange.com/tour, @Juraj


2

Да, можно назначить любые контакты GPIO последовательным, используя библиотеку HardwareSerial, до 3-х UART-соединений. См. эту ссылку для справки: https://copperhilltech.com /blog/esp32-programming-three-serial-ports-uarts-using-the-arduino-ide/

Я тоже играю с двумя Nextion и esp32. было бы здорово пообщаться с вами и провести мозговой штурм

,

0
    #define UART1_ODU_BAUD_RATE 2400
    #define U1RXD 32
    #define U1TXD 33

Используйте это для инициализации UART при настройке

    // Конфигурация UART1
      uart_config_t Configurazione_UART1 = {
        .baud_rate = UART1_ODU_BAUD_RATE,
        .data_bits = UART_DATA_8_BITS,
        .parity = UART_PARITY_EVEN,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
      };
      uart_param_config(NUMERO_PORTA_SERIALE, &Configurazione_UART1);
      esp_log_level_set(TAG, ESP_LOG_INFO);
      uart_set_pin(NUMERO_PORTA_SERIALE, U1TXD, U1RXD, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
      uart_driver_install(NUMERO_PORTA_SERIALE, BUF_SIZE, BUF_SIZE, 20, &uart1_queue, 0);
      xTaskCreate(UART_ISR_ROUTINE, "UART_ISR_ROUTINE", 2048, NULL, 12, NULL);
      //vTaskDelete(NULL);

Создание функции ISR

    static void UART_ISR_ROUTINE(void *pvParameters)                //uart1
    {
      uart_event_t event;
      size_t buffered_size;
      bool exit_condition = false;
      String ODU_PAC_ONE_Temp = "";
    
      ODU_PAC_ONE = "";
    
      while (1) {
        if (xQueueReceive(uart1_queue, (void * )&event, (portTickType)portMAX_DELAY)) {
          if (event.type == UART_DATA) {
            uint8_t UART1_data[128];
            int UART1_data_length = 0;
            ESP_ERROR_CHECK(uart_get_buffered_data_len(UART_NUM_1, (size_t*)&UART1_data_length));
            UART1_data_length = uart_read_bytes(UART_NUM_1, UART1_data, UART1_data_length, 100);
    
            for (byte i = 0; i < UART1_data_length; i++) {
                ODU_PAC_ONE_Temp += (int) UART1_data[i];
            }
          }
          else if (event.type == UART_FRAME_ERR) {
    
          }
        }
        if (exit_condition) {
          break;
        }
      }
      vTaskDelete(NULL);
    }

Здесь вы получите свои данные (int) UART1_data[i]

,

Этот ответ может выиграть от небольшого объяснения. Чем это лучше, чем простое переназначение портов?, @StarCat