Herzlich willkommen zu einer neuen Ausgabe unserer Blogs. Dieses Mal soll es darum gehen wie wir alle seriellen Schnittstellen des ESP-32 Lora Moduls nutzen können.
Der ESP32 hat drei serielle Hardware-Schnittstellen. Die serielle Standard-Schnittstelle Serial an den Anschlüssen GPIO3 (RX) und GPIO1 (TX) wird zur Kommunikation mit der Arduino IDE benutzt und ist fix mit dem CP2102 verdrahtet.
Über die zusätzliche Bibliothek HardwareSerial die Bestandteil des Hardware-Packages für das ESP32-LoRa Board ist, kann man auch die beiden anderen seriellen Hardwareschnittstellen nutzen. Allerdings besteht da ein großes Problem. Die Serielle Schnittstelle 1 ist normalerweise mit den Pins GPIO9(RX) und GPIO10(TX) verbunden, die beim LoRa Board für die Ansteuerung des Flashspeichers benutzt werden und außerdem nicht zugänglich sind. Eine Verwendung dieses Ports würde also unmittelbar zum Crash der Applikation führen. Die Serielle Schnittstelle 2 ist normalerweise mit den Pins GPIO16(RX) und GPIO17(TX) verbunden. Sie kann am LoRa Board benutzt werden, allerdings bleibt dann das Display dunkel, da GPIO16 mit dem Reset des OLED Displays verbunden ist.
Nun, die Lösung dieses Problems ist ganz einfach. Der ESP32 Chip ist in der Lage die seriellen Hardware Schnittstellen (UARTS) mit nahezu jedem IO-Pin zu verbinden. In der .begin() Funktion der HardwareSerial Bibliothek wird dem Rechnung getragen. Diese Funktion hat nämlich drei weitere Parameter mit denen die Konfiguration und die Pin-Zuordnung festgelegt werden kann.
Serial2.begin(9600,SERIAL_8N1,12,13)
Startet die serielle HardwareSchnittstelle 2 mit 9600 Baud und 8 Bit ohne Parität plus 1 Stop Bit an den Pins GPIO12(RX) und GPIO13 (TX). Auf diese Weise können alle drei seriellen Hardwareschnittstellen an allen benutzbaren IO-Pins betrieben werden. Beim LoRa Board sind das die IO-Pins 11, 13, 17, 21, 22 und 23. Für RX können auch die Pins 33 bis 39 verwendet werden, da diese nicht als Ausgang arbeiten können.
Das folgende kleine Beispiel überträgt zum Testen eine Eingabe im Monitorfenster über Serial1 an Serial2 und zurück über Serial1 zur Ausgabe im Monitorfenster. Damit das Programm funktioniert muss der TX Ausgang von Serial1 (GPIO13) mit dem RX Eingang von Serial2 (GPIO22) sowie der TX Ausgang von Serial2 (GPIO23) mit dem RX Eingang von Serial1 (GPIO12) verbunden werden.
//Definition der beiden Schnittstellen HardwareSerial Serial1(1); HardwareSerial Serial2(2); void setup() { //Starten der Schnittstellen Serial.begin(115200); //Serial1 auf Pin 12 und 13 Serial1.begin(9600,SERIAL_8N1,12,13); //Serial2 auf Pin 22 und 23 Serial2.begin(9600,SERIAL_8N1,22,23); //Startmeldung ausgeben Serial.println(); Serial.println("Bitte eine Eingabe:"); } void loop() { int data; //Wir warten auf eine Eingabe vom Monitor-Fenster while (Serial.available()) { //empfangene Daten über Serial1 ausgeben data = Serial.read(); Serial1.write(data); } //Wir warten auf Daten von Serial2 while (Serial2.available()) { //Empfangene Daten auf Serial2 wieder ausgeben data = Serial2.read(); Serial2.write(data); } //Wir warten auf Daten von Serial1 while (Serial1.available()) { //Empfangene Daten auf den Monitor ausgeben data = Serial1.read(); Serial.write(data); } }
Hat Ihnen der heutige Blogbeitrag gefallen? Schreiben Sie uns und lassen Sie uns Ihre Gedanken zum Thema wissen. Wir freuen uns auf Ihre Nachricht. Bis dahin wünschen wir Ihnen noch einen guten Start in die Woche,
Ihr Team AZ-Delivery
8 comments
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 :)