Antworten:
Es ist, weil Sie verwenden exit(0)
. Das schaltet Interrupts aus und geht in eine Endlosschleife. Der serielle Druck wird jedoch zuerst in einen Puffer gelegt, und jedes Zeichen wird dann nacheinander aus diesem Puffer entfernt und über die serielle Schnittstelle gesendet.
Das ist alles in Ordnung, bis zum Ende, wenn Sie verwenden exit(0);
, und was im seriellen Puffer zum Senden übrig bleibt, wird nie gesendet, weil Interrupts deaktiviert sind.
Es gibt nie wirklich einen Grund, exit()
einen Mikrocontroller zu verwenden - wohin kann er schließlich "beendet" werden? Es gibt kein Betriebssystem zum Beenden. Es macht also das nächstbeste, was so nah wie möglich daran ist, nichts zu tun.
Wenn Sie stattdessen Ihr Programm "stoppen" möchten, sollten Sie ein einfaches verwenden, mit while(1);
dem Interrupts weiterhin ausgelöst werden können.
Wenn Sie es wirklich verwenden möchten exit()
, sollten Sie alternativ flush
zuerst die Seriennummer verwenden:
Serial.flush();
Diese Funktion wird blockiert, bis der Sendepuffer durch den Interrupt vollständig geleert wurde und das letzte Byte das TX-Schieberegister des UART verlassen hat.
exit()
Mikrocontroller anrufen sollte . Vielmehr sollte man keine einfache Endlosschleife aufrufen exit()
, was darauf hindeutet, dass es sich um eine ordnungsgemäße POSIX-Funktion handelt.