Forum: Mikrocontroller und Digitale Elektronik ESP32 + Serial.println + Parallele Abarbeitung


von Stephan D. (dost0011)


Lesenswert?

Hallo,
ich habe mit einem ESP32+Arduino einen Regler entworfen, der wunderbar 
funktioniert. Danach schreibe ich Daten zyklisch auf einen HC06 Baustein 
raus - mit Serial2.print. Das Interessante ist nun, dass die Abarbeitung 
der vielen Prints parallel läuft.

Wenn ich mit Micros() die Zeit für den Aufruf der Routine messe (dort 
sind ca. 20 Println drinnen), dann dauert das <10µs !!! Die Daten werden 
auch tatsächlich über Bluetooth gesendet.

Eigentlich ist das ja super, wenn das über einen zweiten Core 
parallelisiert wird. In meinem Fall aber möchte ich ab und zu einen AT 
Befehl an den HC06 senden:

Antwortet er mit OK bin ich nicht verbunden
Antwortet er nicht mit OK bin ich verbunden

Diese Antwort dauert ca. 510ms und ich darf nicht exklusiv darauf 
warten, weil mein Regler sonst ausflippt. Wenn ich auf die Antwort 
warte, darf ich nichts an den HC06 senden, weil sonst der gesendete AT 
Befehl "kaputt" gemacht wird und ich nie mehr eine Antwort bekomme.

Und nun kommt das Problem. Ich denke, dass ich nichts mehr sende, weil 
ja meine Routine ja scheinbar abgearbeitet wurde, tatsächlich arbeitet 
er aber vermutlich auf dem 2. Core noch die Serial2.println ab...

Kann ich irgendeine Information auslesen, ob der Buffer leer ist, also 
ob er mit dem Senden auf dem 2. Core tatsächlich fertig ist?

Hoffentlich habe ich das jetzt verständlich erklärt...

Grüße

von Stephan D. (dost0011)


Lesenswert?

Niemand eine Idee, wie man schauen kann, ob der Serielle Buffer leer 
ist?

von Einer K. (Gast)


Lesenswert?


von dost0011 (Gast)


Lesenswert?

Vielen Dank.
Bei mir hängt die Bluetooth Übertragung an TX2/RX2 vom ESP32. Das ist 
eine Hardware Schnittstelle und da bekomme ich folgenden Fehler:

'class HardwareSerial' has no member named 'availableForWrite'

Gibt es noch eine Möglichkeit?

von Stephan D. (dost0011)


Lesenswert?

bzw. läuft die Abarbeitung wirklich auf dem 2. Core? Warum ist das so 
schnell?

von soundso (Gast)


Lesenswert?

da sind wohl einige interne buffer im spiel ...

mach in deinem Programm eine vernünftige statemachine, die nonblocking 
implementiert ist und ändere während du auf die Antwort wartest den 
zustand von deiner senderoutine auf warten oder so ...

State 1: Controll+Send
State 2: Controll+Wait_on_OK
usw ...

du bekommst das hin ...

von Sebastian S. (amateur)


Lesenswert?

Wenn Du nicht gerade auf der untersten Hardwareebene arbeitest, hast Du 
folgendes Problem:
Die serielle Schnittstelle ist nicht fürs Multitasking gedacht!

Also musst Du nicht nur feststellen ob der Puffer leer ist, sondern sie 
auch schließen bzw. sie in dem parallelen Task öffnen. Je nach Umgebung 
kann das dauern.

von dost0011 (Gast)


Lesenswert?

Hallo,

versteht mich bitte nicht falsch: ich will gar kein Multitasking und mir 
ist die Schnittstelle zu schnell...

Am liebsten hätte ich folgendes:

ich rufe meine ganzen Serial2.println auf und mein Programmcode läuft 
erst weiter, wenn das Zeug auch tatsächlich gesendet wurde.

Bei mir scheint es so zu sein, als ob die Infos für ein paar 
Microsekunden in den Buffer kopiert werden und danach sendet er dann in 
aller Ruhe das Zeugs raus, obwohl mein Programmablauf schon viel weiter 
ist...

Vermutlich liegt es daran, dass ich das erste mal eine Hardware 
Schnittstelle verwende... die Software Schnittstelle hat immer 
gewartet...

von Einer K. (Gast)


Lesenswert?

Und Serial2.flush() wartet nicht, bis alles raus ist?

von Einer K. (Gast)


Lesenswert?

Zumindest findet sich in dessen Tiefen folgende Zeile:
>   while(uart->dev->status.txfifo_cnt);
Was auf mich den Eindruck macht, als müsste es warten, bis alles raus 
ist.

Stephan D. schrieb:
> Kann ich irgendeine Information auslesen, ob der Buffer leer ist,
Auch diese Frage dürfte damit beantwortet sein.
Denn txfifo_cnt dürfte den Füllungsgrad zeigen.

von Einer K. (Gast)


Lesenswert?

Arduino F. schrieb:
> Dann kann ich dir auch nicht helfen...
Konnte doch helfen....

Es ist geschehen!
Serial.availableForWrite() wurde hinzugefügt.
https://github.com/espressif/arduino-esp32/commit/aa1288aa6eb47a179480108742f1e32e67acdccb

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.