esp32 - uart 1 et uart 2 : comportement étrange

le but est de tester une relation half duplex sur un fil entre 2 uart
une résistance de l'un ou l'autre kOhms est soudée entre les broches 18 et 5

ça, ça marche
// de l'uart 1 (pin 18) vers l'uart 2 (pin 5)

//include <HardwareSerial.h>
HardwareSerial serial_1(1);
HardwareSerial serial_2(2);

volatile uint8_t randm;

void setup() {
  Serial.begin(115200);

}

void loop() {
  
  // de l'uart 1 (pin 18) vers l'uart 2 (pin 5)
  delay(1000);
  serial_1.begin(9600, SERIAL_8N1, 19, 18); // baud speed, UART mode, RX pin, TX pin
  serial_2.begin(9600, SERIAL_8N1, 5, 17);
  //Write something like that
  randm = rand();
  Serial.print("rand 1->2  "); Serial.print(randm);
  serial_1.write(randm);
  delay(200);
  while (serial_2.available() ) {
    volatile uint8_t rx_serial_2 = serial_2.read();
    Serial.print("  rx_serial_2 "); Serial.println(rx_serial_2);
    // Do something
  }

 
}

ça, ça marche aussi
// de l'uart 2 (pin 5) vers l'uart 1 (pin 18)

//include <HardwareSerial.h>
HardwareSerial serial_1(1);
HardwareSerial serial_2(2);

volatile uint8_t randm;

void setup() {
  Serial.begin(115200);

}

void loop() {
  
 

  // de l'uart 2 (pin 5) vers l'uart 1 (pin 18)
  delay(1000);
  serial_1.begin(9600, SERIAL_8N1, 18, 19); // baud speed, UART mode, RX pin, TX pin
  serial_2.begin(9600, SERIAL_8N1, 17, 5);
  randm = rand();
  Serial.print("rand 2->1  "); Serial.print(randm);
  serial_2.write(randm);
  delay(200);
  while (serial_1.available() ) {
    volatile uint8_t rx_serial_1 = serial_1.read();
    Serial.print("  rx_serial_1 "); Serial.println(rx_serial_1);
    // Do something
  }

}

mais ça, ça marche pas
// de l'uart 1 (pin 18) vers l'uart 2 (pin 5)
et PAR LA SUITE
// de l'uart 2 (pin 5) vers l'uart 1 (pin 18)

//include <HardwareSerial.h>
HardwareSerial serial_1(1);
HardwareSerial serial_2(2);

volatile uint8_t randm;

void setup() {
  Serial.begin(115200);

}

void loop() {
  
  // de l'uart 1 (pin 18) vers l'uart 2 (pin 5)
  delay(1000);
  serial_1.begin(9600, SERIAL_8N1, 19, 18); // baud speed, UART mode, RX pin, TX pin
  serial_2.begin(9600, SERIAL_8N1, 5, 17);
  //Write something like that
  randm = rand();
  Serial.print("rand 1->2  "); Serial.print(randm);
  serial_1.write(randm);
  delay(200);
  while (serial_2.available() ) {
    volatile uint8_t rx_serial_2 = serial_2.read();
    Serial.print("  rx_serial_2 "); Serial.println(rx_serial_2);
    // Do something
  }

  // de l'uart 2 (pin 5) vers l'uart 1 (pin 18)
  delay(1000);
  serial_1.begin(9600, SERIAL_8N1, 18, 19); // baud speed, UART mode, RX pin, TX pin
  serial_2.begin(9600, SERIAL_8N1, 17, 5);
  randm = rand();
  Serial.print("rand 2->1  "); Serial.print(randm);
  serial_2.write(randm);
  delay(200);
  while (serial_1.available() ) {
    volatile uint8_t rx_serial_1 = serial_1.read();
    Serial.print("  rx_serial_1 "); Serial.println(rx_serial_1);
    // Do something
  }

}

ça serait quoi le souci ?

Bonjour

l'ESP32 est assez souple dans l'attribution des pins aux ressources hardware internes mais il n'est peut être pas possible de changer l'attribution une fois celle-ci faite dans un programme

Dans un premier temps tu câbles l'UART1 vers les pins 19 pour Rx et 18 pour Tx puis plus bas tu permutes ces deuxpins de cet UART (Rx passe en 18 et TX en 19) ce n'est peut être pas possible.

L'ESP32 est souple mais peut être pas contorsionniste :wink: .. ou alors il faut peut être y mettre les formes !!

Dans le fichier esp32-hal-uart.c on voit des fonctions attach et detach pour l'association des pins aux arts ainsi qu'ene fonction uartEnd() qui permet peut être de défaire une association avantt d'en faire une autre.

merci al1fch
j'avais tenté uartEnd(), (entre autres) mais ça n'a rien donné

il est en effet + logique d'utiliser les fonctions genre uartDetachTx(uart_t* uart)
mais peut-on les appeler depuis l'ide arduino ?

penses-tu que si je passe par le sdk j'aurai + de possibilités qu'avec l'ide arduino ?

aucune expérience directe du sdk (IDF) de ma part , je ne sais donc répondre.

la question de la faisabilité via le sdk pourrait être posée sur ce forum hardwaer ESP32 :

et via Arduino içi :

quelqu'un avait donné la réponse sur le forum arduino !
MySerial.end(); libère l'uart mais pas la pin dans la matrice ; il faut le faire en + :
gpio_matrix_out(18, SIG_GPIO_OUT_IDX, false, false); // par exemple pour la pin 18

je vous donne le code fonctionnel à toutes fins utiles, c'est pas trop mal au niveau de la vitesse 8)

// pour le test, une résistance de l'un ou l'autre kOhms est soudée entre les broches 18 et 5
//include <HardwareSerial.h>
HardwareSerial serial_1(1);
HardwareSerial serial_2(2);

volatile uint8_t randm;

void setup() {
  Serial.begin(115200);

}

void loop() {
 
   // de l'uart 1 (pin 18) vers l'uart 2 (pin 5)
serial_1.end(); serial_2.end();
gpio_matrix_out(18, SIG_GPIO_OUT_IDX, false, false);
gpio_matrix_out(5, SIG_GPIO_OUT_IDX, false, false);
  delay(5);
  serial_1.begin(115200, SERIAL_8N1, 19, 18); // baud speed, UART mode, RX pin, TX pin // (19) 18
  serial_2.begin(115200, SERIAL_8N1, 5, 19); // // 5 (19) la pin 19 est parasitée
  //Write something like that
  randm = rand();
  Serial.print("rand 1->2  "); Serial.print(randm);
  serial_1.write(randm);
  delay(5);
  while (serial_2.available() ) {
    volatile uint8_t rx_serial_2 = serial_2.read();
    Serial.print("  rx_serial_2 "); Serial.println(rx_serial_2);
    if (randm != rx_serial_2) Serial.println("COVID_32 !");
    // Do something
  }

  // de l'uart 2 (pin 5) vers l'uart 1 (pin 18)
serial_1.end(); serial_2.end();  
gpio_matrix_out(18, SIG_GPIO_OUT_IDX, false, false);
gpio_matrix_out(5, SIG_GPIO_OUT_IDX, false, false);
  delay(5);
  serial_1.begin(115200, SERIAL_8N1, 18, 19); // baud speed, UART mode, RX pin, TX pin
  serial_2.begin(115200, SERIAL_8N1, 19, 5);  // 5 (19) la pin 19 est parasitée
  randm = rand();
  Serial.print("rand 2->1  "); Serial.print(randm);
  serial_2.write(randm);
  delay(5);
  while (serial_1.available() ) {
    volatile uint8_t rx_serial_1 = serial_1.read();
    Serial.print("  rx_serial_1 "); Serial.println(rx_serial_1);
    if (randm != rx_serial_1) Serial.println("COVID_33 !");
    // Do something
  }

}

Merci du retour, ça peut servir !!

Effectivement l'UART et la matrice de connection des GPIO des ESP32 sont deux choses différentes.