Go Down

Topic: SerialEvent mit SoftSerial (Read 342 times) previous topic - next topic

GreyDiamond

Hallo, ich habe eine SoftSerial Port auf einem AtTiny45. Jetzt möchte ich SerialEvent nutzen um auf SoftSerial Kommandos zureagieren (interrupt). Wie mache ich das?? Kann ich einfach die Funktion von Serial nutzen?? Oder gibt es noch eine andere Libary?
Gebt mir einen Hebel, der lang genug, und einen Angelpunkt, der stark genug ist, dann kann ich die Welt mit einer Hand bewegen. ~Archimedes

combie

#1
Apr 22, 2019, 02:24 pm Last Edit: Apr 22, 2019, 02:25 pm by combie
Quote
Jetzt möchte ich SerialEvent nutzen um auf SoftSerial Kommandos zureagieren (interrupt).
SerialEvent ist kein Interrupt!
Kein Problem, das für Softwareserial nachzubauen.

Oder habe ich dich falsch verstanden?
Je größer der Dachschaden, um besser der Blick auf die Sterne.

GreyDiamond

#2
Apr 22, 2019, 02:27 pm Last Edit: Apr 22, 2019, 02:28 pm by GreyDiamond
Ja, es ist kein Interrupt. Gibt es eine fertige Funktion dafür? Oder muss ich das komplett selber machen? (Das eine Funktion aufgerufen wird wenn eine neue "Nachricht" per SoftSerial ankommt.)
Gebt mir einen Hebel, der lang genug, und einen Angelpunkt, der stark genug ist, dann kann ich die Welt mit einer Hand bewegen. ~Archimedes

combie

#3
Apr 22, 2019, 02:34 pm Last Edit: Apr 22, 2019, 02:37 pm by combie
Im einfachsten Fall:

Code: [Select]

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX


void SoftwareSerialEvent()
{
  int value = mySerial.read();
  // werte Kommando aus
}


void setup()
{
  mySerial.begin(4800);
}

void loop()
{
  if(mySerial.available()) SoftwareSerialEvent();
}
Je größer der Dachschaden, um besser der Blick auf die Sterne.

Serenifly

SerialEvent könnte nicht überflüssiger sein. Das ist nur eine Funktion die automatisch und versteckt am Ende von loop() aufgerufen wird. Das kann man genauso und übersichtlicher per Hand machen

combie

Ich bin ein SerialEvent Fan!
Wo es nur geht, dann SerialEvent.
Je größer der Dachschaden, um besser der Blick auf die Sterne.

dsyleixa

#6
Apr 22, 2019, 03:06 pm Last Edit: Apr 22, 2019, 03:12 pm by dsyleixa
serialEvent() ist eine in Arduino bereits vordefinierte Funktion,  die scheinbar (!) im Hintergrund arbeitet und sich (scheinbar!) wie ein Interrupt selber aktiviert.
Man muss sie dazu nicht extra (in loop() )  aufrufen oder  (in setup() ) initialisieren.
Man muss ihren Namen nur hinschreiben, und sie tut dann das, was man in ihren Funktionskörper schreibt.
(in Wirklichkeit wird sie wohl automatisch in loop() aktiviert, ohne dass man es sieht.)

In SoftSerial scheint es sie nicht zu geben, und man muss sie offenbar selber in  loop() selber als Funktionsaufruf aktivieren.
https://www.arduino.cc/en/Tutorial/SerialEvent

Serenifly

(in Wirklichkeit wird sie wohl automatisch in loop() aktiviert, ohne dass man es sieht.)
Die Funktion ist als "weak" deklariert. Das heißt es existiert eine Deklaration, aber die Definition ist optional. Bei einer normalen Funktion würde der Linker einen Fehler produzieren, aber hier kann er weiter arbeiten

Darauf kann man dann abfragen:
Code: [Select]

for (;;) {
  loop();
  if (serialEventRun) serialEventRun();
}

Wenn keine Definition existiert ist die Adresse 0

GreyDiamond

Vielen Dank für die Antworten und den Beispiel Code von combie!
Gebt mir einen Hebel, der lang genug, und einen Angelpunkt, der stark genug ist, dann kann ich die Welt mit einer Hand bewegen. ~Archimedes

Go Up