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
Niemand eine Idee, wie man schauen kann, ob der Serielle Buffer leer ist?
Stephan D. schrieb: > ESP32+Arduino https://www.arduino.cc/reference/en/language/functions/communication/serial/availableforwrite/ Hilft dir nicht? Dann kann ich dir auch nicht helfen...
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?
bzw. läuft die Abarbeitung wirklich auf dem 2. Core? Warum ist das so schnell?
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 ...
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.
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...
Und Serial2.flush() wartet nicht, bis alles raus ist?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.