Benvenuti in una nuova edizione dei nostri blog. Questa volta si tratta di come utilizzare tutte le interfacce seriali del modulo Lora ESP-32.
ESP32 ha tre interfacce hardware seriali. L'interfaccia seriale standard seriale alle connessioni GPIO3 (RX) e GPIO1 (TX) viene utilizzata per la comunicazione con l'IDE Arduino ed è permanentemente cablata al CP2102.
Tramite la libreria aggiuntiva HardwareSerial, che fa parte del pacchetto hardware per la scheda ESP32-LoRa, è anche possibile utilizzare le altre due interfacce hardware seriali. Tuttavia, c'è un grosso problema. L'interfaccia seriale 1 è normalmente collegata ai pin GPIO9 (RX) e GPIO10 (TX), che vengono utilizzati con la scheda LoRa per controllare la memoria flash e non sono accessibili. L'uso di questa porta comporterebbe immediatamente un arresto anomalo dell'applicazione. L'interfaccia seriale 2 è normalmente collegata ai pin GPIO16 (RX) e GPIO17 (TX). Può essere utilizzato sulla scheda LoRa, ma il display rimane scuro perché GPIO16 è collegato al ripristino del display OLED.
Bene, la soluzione a questo problema è molto semplice. Il chip ESP32 è in grado di collegare le interfacce hardware seriali (UARTS) a quasi tutti i pin IO. Questo viene preso in considerazione nella funzione .begin () della libreria HardwareSerial. Questa funzione ha tre parametri aggiuntivi con cui è possibile definire la configurazione e l'assegnazione dei pin.
Serial2.begin (9600, SERIAL_8N1,12,13)
Avvia l'interfaccia hardware seriale 2 con 9600 baud e 8 bit senza parità più 1 bit di stop sui pin GPIO12 (RX) e GPIO13 (TX). In questo modo, tutte e tre le interfacce hardware seriali possono essere gestite su tutti i pin IO utilizzabili. Sulla scheda LoRa, si tratta di pin IO 11, 13, 17, 21, 22 e 23. I pin da 33 a 39 possono essere utilizzati anche per RX, in quanto non possono funzionare come uscite.
Il seguente piccolo esempio trasferisce un input nella finestra del monitor da Serial1 a Serial2 e viceversa tramite Serial1 per il test nella finestra del monitor. Per il funzionamento del programma, l'uscita TX da Seriale1 (GPIO13) deve essere collegata all'ingresso RX da Seriale2 (GPIO22) e l'uscita TX da Seriale2 (GPIO23) all'ingresso RX da Seriale1 (GPIO12).
// Definizione delle due interfacce Serial hardware Serial1(1); Serial hardware Serial2(2); vuoto configurazione() { // avvia le interfacce serial.iniziare(115200); // Seriale1 sui pin 12 e 13 Serial1.iniziare(9600,SERIAL_8N1,12,13); // Seriale2 sui pin 22 e 23 Serial2.iniziare(9600,SERIAL_8N1,22,23); // messaggio di avvio dell'output serial.println(); serial.println("Inserisci:"); } vuoto cappio() { int dati; // Stiamo aspettando l'input dalla finestra del monitor mentre (serial.disponibile()) { // emette i dati ricevuti via seriale1 dati = serial.leggere(); Serial1.write(dati); } // Stiamo aspettando i dati da Serial2 mentre (Serial2.disponibile()) { // Emette di nuovo i dati ricevuti su Serial2 dati = Serial2.leggere(); Serial2.write(dati); } // Stiamo aspettando i dati da Serial1 mentre (Serial1.disponibile()) { // Emette i dati ricevuti sul monitor dati = Serial1.leggere(); serial.write(dati); } }
Ti è piaciuto il post sul blog di oggi? Scrivici e facci sapere cosa ne pensi dell'argomento. Non vediamo l'ora del tuo messaggio. Fino ad allora, ti auguriamo un buon inizio di settimana,
La tua squadra AZ-Delivery
8 commenti
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 :)