ich habe mal eine Frage zur folgenden Anweisung aus der main.cpp:
if (serialEventRun) serialEventRun();
Wenn ich es richtig sehe, wird ja die Funktion serialEventRun() aus HardwareSerial.cpp aufgerufen, falls die Variable serialEventRun ungleich Null ist. Ich finde aber nirgends eine Stelle, wo die Variable "serialEventRun" definiert ist. Kann mir jemand einen Tipp geben?
Die Funktion "serialEventRun" wird als "weak"-Symbol deklariert. Damit kann dieses Symbol von anderen Definitionen überschrieben werden, aber auch "0" sein, wenn es keine Definition für dieses Symbol gibt.
Das
if (serialEventRun) serialEventRun();
bedeutet also im Grunde: Wenn es eine implementierte Funktion "serialEventRun" gibt, dann führe sie aus. Wenn nicht, dann nicht.
Die Erklärung warum das gemacht wird, findet sich in der HardwareSerial.cpp:
// this next line disables the entire HardwareSerial.cpp,
// this is so I can support Attiny series and any other chip without a uart #if defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)
Wenn also ein Chip verwendet wird, der kein UART kann, gibts auch keine implementierte "serialEventRun" Funktion. Dann würde der Compiler aber meckern, weil es die Funktion nicht gibt, da sie ja in der main.cpp drin steht.
Das Gleiche wird übrigens auch mit der Funktion "serialEvent()" gemacht. Die wird in der HardwareSerial.cpp auch als "weak"-Symbol definiert und dort zusätzlich als "leere"-Funktion angelegt. Damit kann man die Funktion trotzdem durch eine eigene im Sketch überschreiben und es gibt keine Compilerfehler das eine Funktion doppelt definiert wurde.