Kann man serialEvent1() temporär abschalten?

Hallo,

ich habe einen ungestümen Teilnehmer an Serial1 eines ATmega2560.
Der sendet alle paar Sekunden ein größeres Datenpaket und ich habe keinen Einfluss darauf ob der senden soll oder nicht. Mir würde es aber reichen wenn ich die Daten nur alle 10 Minuten empfangen würde.

Deshalb die Frage: Wie kann ich serialEvent1() abschalten und bei Bedarf wieder einschalten.

Sicherlich kann ich die empfangenen Daten verwerfen wenn ich die nicht brauche, aber alleine schon der Empfang kostet viel (mir zu viel) Rechenzeit.

Gruß Peter

Ich glaube da liegt ein Missverständnis vor. serialEvent1() ist sowieso mit dem Attribut “weak” deklariert und wird daher nur verwendet wenn diese Funktion auf definiert wurde. Ansonsten spielt es keine Rolle.

Wenn du die Empfangs-Funktion per Hand schreibst hast du mehr Kontrolle über das was gemacht wird.

Ich habe serialEvent1 im Programm deklariert weil mir das erst mal für meinen Bedarf sinnvoll erschien.
Es funktioniert ja auch, kostet aber viel Rechenzeit weil ständig Daten herein kommen.

Eine Idee war Serial1.end(); zu verwenden, aber das bringt die verlorene Regenzeit nicht zurück.

Der zweite Gedanke war, dass serialEvent1() auf einen Interrupt im Controller reagiert den man evtl. wegmaskieren könnte. Aber das ist wohl auch nicht der Fall.

Dann werde ich das ganze mal über Serial1.available() versuchen zu lösen.

Danke für die Hilfe.

Gruß Peter

Die SerialEvents werden erst aufgerufen, wenn etwas empfangen wurde. Natürlich kannst Du dann alles mit Serial1.read() wegwerfen, das bringt aber keine Rechenzeit zurück.

Nimm besser Serial1.end(), um die Schnittstelle ganz abzuschalten. Dann mußt Du aber nach dem nächsten Serial1.begin() nach dem Anfang einer Zeile oder sonst einem Synchronisationscode suchen, ab dem die Eingabe richtig weiterverarbeitet werden kann.

serialEventx() ist eine große Spaßbremse und Rechenzeitverbraucher

Ich habe mal einen kleinen Test gemacht.
Eine Testprogramm schafft ohne serialEvent() 198000 Loopdurchläufe pro Sekunde.

Nach einfügen von:

void serialEvent1() {
  Serial1.read();
}

außerhalb von loop() sind es noch 134000 Loopdurchläufe pro Sekunde.

Nach zusätzlichem einfügen von:

void serialEvent2() {
  Serial2.read();
}

außerhalb von loop() sind es noch 99000 Loopdurchläufe pro Sekunde.

Nach zusätzlichem einfügen von:

void serialEvent3() {
  Serial3.read();
}

außerhalb von loop() sind es noch 78000 Loopdurchläufe pro Sekunde.

Ein Serialx.end() ändert nichts an den Ergebnissen.
Es ist auch egal ob über die serielle Schnittstelle Daten herein kommen oder nicht.
serialEventx() ist immer eine kräftige Bremse. Auch wenn nichts zu tun ist.

Gruß Peter

Nun ja, soooo "kräftig" ist die Bremse auch wieder nicht. Wenn sich die Durchlaufzeit von einer fast leeren Schleife verdreifacht, dann ist das immer noch fast Leerlauf. Wieviele digitalWrite() braucht man, um auf das gleiche Ergebnis zu kommen?

peter_de:
serialEventx() ist eine große Spaßbremse und Rechenzeitverbraucher

Inwiefern hast Du denn unterschiedlich viel Spaß mit einem Do-Nothing-Programm, das

  • entweder 198000 mal pro Sekunde nichts macht
  • oder 99000 mal pro Sekunde nichts macht
    oder 78000 mal pro Sekunde nichts macht

Ich kann den Unterschied beim Spaß nicht erkennen.
Erklär mal!

peter_de:
Der zweite Gedanke war, dass serialEvent1() auf einen Interrupt im Controller reagiert den man evtl. wegmaskieren könnte.

Nur eine Idee: SoftwareSerial kennt stopListening mit setRxIntMsk(false);

Ich habe in meinem aktuellen Projekt ein paar Zeitkritische Dinge drin und deshalb einen Loopzähler/Sekunde eingebaut. Damit kann man in etwa die Zunahme der Auslastung ermitteln wenn neue Programmteile dazu kommen.

Mit einfügen von serialEvent1 reduzierten sich die Loops/Sekunde von 100000 auf 80000 und das fand ich schon etwas heftig.

Spaß mit einem Do-Nothing-Programm habe ich nicht, das war für mich ein notwendiges Übel zur Problemlösung.

serialEvent ist einfach in der Handhabung weshalb ich es mal ausprobiert hatte.
Jetzt lese ich bei Bedarf über Serial.available. Das bremst dann mal für eine halbe etwas Sekunde aus, aber nur dann wenn ich die Daten brauche und nicht ständig.

SoftwareSerial wollte ich nicht nutzen weil noch 3 HardwareSerial frei waren.

Gruß Peter