Bienvenidos a una nueva edición de nuestros blogs. Esta vez se tratará de cómo podemos utilizar todas las interfaces seriales del módulo ESP-32 Lora.
El ESP32 tiene tres interfaces de hardware serie. La interfaz serie estándar Serial en los puertos GPIO3 (RX) y GPIO1 (TX) se utiliza para la comunicación con el IDE de Arduino y se fija por cable al CP2102.
La biblioteca HardwareSerial adicional, que forma parte del paquete de hardware para la placa ESP32-LoRa, le permite utilizar las otras dos interfaces de hardware serie. Sin embargo, hay un problema importante. La interfaz serie 1 se conecta generalmente a los pines gPIO9(RX) y GPIO10(TX), que se utilizan en la placa LoRa para controlar la memoria flash y también son inaccesibles. Por lo tanto, el uso de este puerto conduciría directamente al bloqueo de la aplicación. La interfaz serie 2 se conecta generalmente a los pines gPIO16(RX) y GPIO17(TX). Se puede utilizar en la placa LoRa, pero la pantalla permanece oscura ya que GPIO16 está conectado al restablecimiento de la pantalla OLED.
Bueno, la solución a este problema es bastante simple. El chip ESP32 es capaz de conectar las interfaces de hardware serie (UARTS) a casi cualquier pin de E/S. La función .begin() de la biblioteca HardwareSerial tiene esto en cuenta. Esta función tiene otros tres parámetros con los que se pueden establecer la configuración y la asignación de pines.
Serial2.begin(9600.SERIAL_8N1.12.13)
Inicia la interfaz de hardware serie 2 con 9600 baudios y 8 bits sin paridad más 1 bit de parada en los pines GPIO12(RX) y GPIO13 (TX). De esta manera, las tres interfaces de hardware serie se pueden operar en todos los pines de E/S utilizables. Para la placa LoRa, estos son los pines de E/S 11, 13, 17, 21, 22 y 23. Para RX, también se pueden utilizar los pines 33 a 39, ya que no pueden funcionar como salidas.
En el siguiente pequeño ejemplo se transfiere la entrada de la ventana del monitor a Serial2 para realizar pruebas a través de Serial1 y volver a Salida en la ventana Monitor a través de Serial1. Para que el programa funcione, la salida TX de Serial1 (GPIO13) debe estar conectada a la entrada RX de Serial2 (GPIO22) y a la salida TX de Serial2 (GPIO23) a la entrada RX de Serial1 (GPIO12).
Definición de las dos interfaces HardwareSerial Serial1(1); HardwareSerial Serial2(2); Vacío Configuración() { Inicio de las interfaces Serial.Comenzar(115200); Serial1 en los pines 12 y 13 Serial1.Comenzar(9600,SERIAL_8N1,12,13); Serial2 en los pines 22 y 23 Serial2.Comenzar(9600,SERIAL_8N1,22,23); Emitir el mensaje de inicio Serial.println(); Serial.println("Por favor, ingrese:"); } Vacío Bucle() { Int Datos; Estamos esperando la entrada desde la ventana del monitor Mientras (Serial.Disponible()) { Salida de datos recibidos a través de Serial1 Datos = Serial.Leer(); Serial1.Escribir(Datos); } Estamos esperando datos de Serial2 Mientras (Serial2.Disponible()) { Salida de datos recibidos a Serial2 Datos = Serial2.Leer(); Serial2.Escribir(Datos); } Estamos esperando datos de Serial1 Mientras (Serial1.Disponible()) { Salida de datos recibidos al monitor Datos = Serial1.Leer(); Serial.Escribir(Datos); } }
¿Te gustó la entrada de blog de hoy? Escríbenos y cuéntanos tus pensamientos sobre el tema. Esperamos tener noticias suyas. Hasta entonces, les deseamos un buen comienzo de la semana,
Su equipo AZ-Delivery
8 comentarios
Andreas Wolter
@Max: versuchen Sie es bitte mal damit, die ersten drei Zeilen zu entfernen.
So wie es aussieht, müssen die beiden Objekte Serial1 und Serial2 nicht neu instanziiert werden. Wenn ich das teste, wird es ohne Fehler kompiliert. Wenn die Zeilen drin bleiben, erhalte ich den gleichen Fehler. Der Hinweis des Compilers sagt auch deutlich, dass diese Objekte bereits existieren.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Max
Guten Tag,
Ich würde deinen Code sehr gerne für Arduino und ESP32 ausprobieren, leider erscheint eine Fehlermeldung und der ESP32 lässt sich nicht programmieren. kannst du helfen
Danke
ino:2: first defined here ( HardwareSerial Serial1(1); )
ino:3: first defined here ( HardwareSerial Serial2(2); )
Hannes
Only a Warning. If you use Pin12 for serial communication… Let it closed when you are programming new code… You will get problems because this pin also controls the voltage regulator of the flash!
So dont wunder if you get several warnings and Errors when trying to programm the board — when pin12 is active! Get it unconnected … Everything ist right again….
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
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
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
Sehr interessanter Beitrag über die seriellen Schnittstellen. Weiter so.
Neidhard
Ich finde es super das der ESP32 hier oft gezeigt wird. Weiter so :)