Welkom bij een nieuwe editie van onze blogs. Dit keer gaat het erom hoe we alle seriële interfaces van de ESP-32 Lora-module kunnen gebruiken.
De ESP32 heeft drie seriële hardware-interfaces. De standaard seriële interface Serieel bij de verbindingen GPIO3 (RX) en GPIO1 (TX) wordt gebruikt voor communicatie met de Arduino IDE en is permanent aangesloten op de CP2102.
Via de extra bibliotheek HardwareSerial, die deel uitmaakt van het hardwarepakket voor het ESP32-LoRa-bord, kunt u ook de andere twee seriële hardware-interfaces gebruiken. Er is echter een groot probleem. De seriële interface 1 is normaal verbonden met de pinnen GPIO9 (RX) en GPIO10 (TX), die worden gebruikt met de LoRa-kaart om het flash-geheugen te bedienen en zijn ook niet toegankelijk. Als u deze poort gebruikt, zou de toepassing direct vastlopen. De seriële interface 2 is normaal verbonden met de pinnen GPIO16 (RX) en GPIO17 (TX). Het kan worden gebruikt op het LoRa-bord, maar het scherm blijft donker omdat GPIO16 is verbonden met de reset van het OLED-scherm.
Welnu, de oplossing voor dit probleem is heel eenvoudig. De ESP32-chip kan de seriële hardware-interfaces (UARTS) met bijna elke IO-pin verbinden. Hiermee wordt rekening gehouden in de functie .begin () van de HardwareSerial-bibliotheek. Deze functie heeft drie extra parameters waarmee de configuratie en de pintoewijzing kunnen worden gedefinieerd.
Serial2.begin (9600, SERIAL_8N1,12,13)
Start de seriële hardware-interface 2 met 9600 baud en 8 bits zonder pariteit plus 1 stopbit op de pinnen GPIO12 (RX) en GPIO13 (TX). Op deze manier kunnen alle drie seriële hardware-interfaces worden bediend op alle bruikbare IO-pinnen. Op het LoRa-bord zijn dit IO-pinnen 11, 13, 17, 21, 22 en 23. Pinnen 33 tot 39 kunnen ook worden gebruikt voor RX, omdat deze niet als uitvoer kunnen werken.
Het volgende kleine voorbeeld draagt een invoer in het monitorvenster over via Serial1 naar Serial2 en terug via Serial1 voor testen in het monitorvenster. Het programma werkt alleen als de TX-uitgang van Serial1 (GPIO13) is aangesloten op de RX-ingang van Serial2 (GPIO22) en de TX-uitgang van Serial2 (GPIO23) op de RX-ingang van Serial1 (GPIO12).
// Definitie van de twee interfaces HardwareSerial Serieel1(1); HardwareSerial Serieel2(2); nietig instellen() { // start de interfaces Serie.beginnen(115200); // Serieel1 op pennen 12 en 13 Serieel1.beginnen(9600,SERIAL_8N1,12,13); // Serial2 op pin 22 en 23 Serieel2.beginnen(9600,SERIAL_8N1,22,23); // output startbericht Serie.println(); Serie.println("Voer alstublieft in:"); } nietig lus() { int gegevens; // We wachten op invoer vanuit het monitorvenster terwijl (Serie.beschikbaar()) { // output ontvangen gegevens via serial1 gegevens = Serie.lezen(); Serieel1.schrijven(gegevens); } // We wachten op gegevens van Serial2 terwijl (Serieel2.beschikbaar()) { // Voer de ontvangen gegevens opnieuw uit op Serial2 gegevens = Serieel2.lezen(); Serieel2.schrijven(gegevens); } // We wachten op gegevens van Serial1 terwijl (Serieel1.beschikbaar()) { // Output ontvangen gegevens op de monitor gegevens = Serieel1.lezen(); Serie.schrijven(gegevens); } }
Vond je het blogbericht van vandaag leuk? Schrijf ons en laat ons weten wat u ervan vindt. Wij verheugen ons op uw bericht. Tot die tijd wensen we je een goede start van de week,
Uw team AZ-levering
8 Reacties
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 :)