ESP-32 Lora use all serial interfaces

Welcome to a new edition of our blogs. This time it will be about how we can use all the serial interfaces of the ESP-32 Lora module.

The ESP32 has three serial hardware interfaces. The standard serial interface Serial on the ports GPIO3 (RX) and GPIO1 (TX) is used for communication with the Arduino IDE and is fixed wired to the CP2102.

The additional HardwareSerial library, which is part of the hardware package for the ESP32-LoRa board, allows you to use the other two serial hardware interfaces. However, there is a major problem. Serial interface 1 is usually connected to the gPIO9(RX) and GPIO10(TX) pins, which are used on the LoRa board to control the flash memory and are also inaccessible. Using this port would therefore lead directly to the crash of the application. Serial interface 2 is usually connected to the gPIO16(RX) and GPIO17(TX) pins. It can be used on the LoRa board, but the display remains dark as GPIO16 is connected to the reset of the OLED display.

Well, the solution to this problem is quite simple. The ESP32 chip is able to connect the serial hardware interfaces (UARTS) to almost any IO pin. The .begin() function of the HardwareSerial library takes this into account. This function has three other parameters with which the configuration and the pin assignment can be set.

Serial2.begin(9600.SERIAL_8N1.12.13)

Starts the serial hardware interface 2 with 9600 baud and 8 bits without parity plus 1 stop bit on the pins GPIO12(RX) and GPIO13 (TX). In this way, all three serial hardware interfaces can be operated on all usable IO pins. For the LoRa board, these are the IO pins 11, 13, 17, 21, 22 and 23. For RX, pins 33 to 39 can also be used, as they cannot work as outputs.

The following small example transfers input in the monitor window to Serial2 for testing via Serial1 and back to Output in the Monitor window via Serial1. For the program to work, the TX output of Serial1 (GPIO13) must be connected to the RX input of Serial2 (GPIO22) and the TX output of Serial2 (GPIO23) to the RX input of Serial1 (GPIO12).

 

 

Definition of the two interfaces
HardwareSerial Serial1(1);
HardwareSerial Serial2(2);

Void Setup() {   Starting the interfaces   Serial.Begin(115200);   Serial1 on pins 12 and 13   Serial1.Begin(9600,SERIAL_8N1,12,13);   Serial2 on pins 22 and 23   Serial2.Begin(9600,SERIAL_8N1,22,23);   Output the start message   Serial.println();   Serial.println("Please enter:");

}

Void Loop() {   Int Data;   We are waiting for input from the monitor window   while (Serial.available()) {     Output received data via Serial1     Data = Serial.Read();     Serial1.Write(Data);   }   We are waiting for data from Serial2   while (Serial2.available()) {     Output received data back to Serial2     Data = Serial2.Read();     Serial2.Write(Data);   }   We are waiting for data from Serial1   while (Serial1.available()) {     Output received data to the monitor     Data = Serial1.Read();     Serial.Write(Data);   }

}

Did you like today's blog post? Write to us and let us know your thoughts on the subject. We look forward to hearing from you. Until then, we wish you a good start to the week,

Your team AZ-Delivery

Esp-32Projekte für anfänger

5 comments

Thorsten

Thorsten

Wieder einmal eine große Hilfe durch einen kleinen Artikel .
Aber da ist noch etwas offen, das ich mir auch nicht ergoogeln kann:
Die Methode begin() hat zwei weitere Parameter. Der vollständige Prototyp lautet:
void begin(unsigned long baud, uint32_t config=SERIAL_8N1, int8_t rxPin=-1, int8_t txPin=-1, bool invert=false, unsigned long timeout_ms = 20000UL);
Unter “invert” kann ich mir vorstellen, dass halt 0/1 inversen 0/3.3V Pegel haben, soweit kein Problem.
Aber der Timeout lässt offen, ob es sich um Mikrosekunden oder Millisekunden handelt. Oder gar um Bitzeiten, also Baudratenabhängig? Ausserdem – wann und wo wirkt sich das aus? Wenn das die Wartezeit des .read() auf ein char ist kann ich mir meine selbstgestrickte wartemethode mit Serial2.available() sparen.

Peter Freundorfer

Peter Freundorfer

Hallo Zusammen,
Erstmal danke für die Anregung zu der HardwareSerial, hat mir sehr geholfen.
Eine Frage hab ich noch, ihr verwendet hier ist data; als Variable, gibt es hierfür einen Grund ( data) ? Oder kann hier jede andere Bezeichnung für die variablen verwendet werden… ich möchte für eine Fehlersuche den Datenaustausch auf einer RS232 mitschreiben und würde hat gerne RX und TX in unterschiedliche Variablen schieben in die Daten sauber getrennt ablegen zu können. Über eine Antwort würde Ichsucht sehr freuen

Andreas

Andreas

Das hat mir mit wenig Aufwand viel geholfen, auch für den ESP WROOM 32. Ist ein Tool, mit dem man die Funktion der Schnittstellen testen kann und auf dem man gut aufbauen kann. Danke hierfür!

Werner

Werner

Sehr interessanter Beitrag über die seriellen Schnittstellen. Weiter so.

Neidhard

Neidhard

Ich finde es super das der ESP32 hier oft gezeigt wird. Weiter so :)

Leave a comment

All comments are moderated before being published