Last Updated on 15. Oktober 2026 by sfambachLink-Status: OK
Ist es möglich, Eingaben auf der Seriellen-Schnittstelle per Interrupt abzufangen?
Die Antwort ist wohl eher Jain, es ist möglich, die Serial Event Funktion zu verwenden. Diese wird nach jeder Loop ausgeführt, unterbricht diese aber nicht.
Zweck
- Benutzereingaben über Terminal
- Kommunikation mit anderen Geräten über die Serielle-Schnittstelle
Nötige Bibliotheken
Keine
Programm
Es gibt in der Arduino-Gui die Möglichkeit, eine EventFunktion zu verwenden. Diese wird immer nach dem Loop aufgerufen, unterbricht aber keinen laufenden Code.
Quellcode SerialEvent.ino (GitHubLink-Status: OK)
/** Test the Serial Event
* Autor: S. Fambach
* Visit http://www.fambach.net if you want
*/
boolean stringComplete = false;
String serialInput;
/**
* Remove sting to the first occurance of \n
*/
String getFirstInput() {
int index = serialInput.indexOf("\n");
String ret = serialInput.substring(0, index);
// remove also the new line
serialInput.remove(0, index+1);
stringComplete = false;
return ret;
}
void setup() {
// start the serial
Serial.begin(115200);
// reserve some memmory for the string
serialInput.reserve(50);
}
void loop() {
// if there is a finished input do something
if ( stringComplete ) {
Serial.print("Received: ");
Serial.println(getFirstInput());
}
}
/**
* serial event function will be called after the loop automatically
*
*/
void serialEvent() {
// read everything from the serial
while (Serial.available()) {
Serial.print(".");
char inChar = (char)Serial.read();
// add it to the inputString:
serialInput += inChar;
if (inChar == '\n' ) {
stringComplete = true;
}
}
}
Damit die Event Funktion nicht blockiert, habe ich die WHILE Schleife herausgenommen. Die Funktion ist die gleiche wie vorher, allerdings wird bei jedem Zeichen nochmal die Arbeitsschleife durchlaufen. Dies kann evtl. zu anderen unerwünschten Effekten führen.
Quellcode SerialEventNonBlocking.ino (GitHubLink-Status: OK)
/** Test the Serial Event
* Read data in the event and print it when its finished
* Autor: S. Fambach
* Visit http://www.fambach.net if you want
*/
boolean stringComplete = false;
String serialInput;
/**
Remove sting to the first occurance of \n
*/
String getFirstInput() {
int index = serialInput.indexOf("\n");
String ret = serialInput.substring(0, index);
// remove also the new line
serialInput.remove(0, index + 1);
stringComplete = false;
return ret;
}
void setup() {
// start the serial
Serial.begin(115200);
// reserve some memmory for the string
serialInput.reserve(50);
}
void loop() {
// if there is a finished input do something
if ( stringComplete ) {
Serial.print("Received: ");
Serial.println(getFirstInput());
}
}
/**
serial event function will be called after the loop automatically
*/
void serialEvent() {
// read something
}
Probleme
Ausgabe erfolgt nicht
Darauf achten, dass das verwendete Terminal auf das Zeilenende „new line“ eingestellt ist.
Fazit
Kein Interrupt, aber dafür eine Funktionalität, die man nutzen kann.
Andere Shorties
- CodeShorty: Wire Scannen (Uno)Link-Status: OK
Quellen
https://forum.arduino.cc/t/how-to-use-serial-interrupt-in-arduino/335712/29Link-Status: OK
https://www.arduino.cc/en/Tutorial/BuiltInExamples/SerialEventLink-Status: OK
https://forum.arduino.cc/t/interrupt-uber-serielle-schnittstelle/545390Link-Status: OK
https://forum.arduino.cc/t/interrupt-sobald-daten-in-serial-eingangspuffer-stehen/132916Link-Status: OK
| Datum | Änderung | Autor |
|---|---|---|
| 15.10.2026 | Beispielcode als Code-Block eingefügt (Einbettung über gist-it.appspot.com funktionierte nicht mehr) | sfambach |
| 03.10.2026 | Rechtschreibung korrigiert: Tippfehler, Groß-/Kleinschreibung, Kommas Log-Liste eingefügt | sfambach |
| 14.11.2021 | Beitrag erstellt | sfambach |