Warum druckt Serial.print nur einen Wert für 0-84 für ein 100-Integer-Array?


7
int a[100],i;
void setup() {
  Serial.begin(9600);
}

void loop() {
  for(i=0; i<100; i++) {
    a[i] = i;
    Serial.println(a[i]);
  }
  exit(0);
}

Antworten:


26

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 flushzuerst 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.


2
Und von dieser Antwort (unter der Annahme von mehr als 1000 Bytes RAM) beträgt der UART-Puffer 64 Bytes, was gerade ausreicht, um die verbleibenden 15 Zahlen (jeweils zwei Bytes + CR + LF) mit vier verbleibenden Bytes aufzunehmen.
TripeHound

Ich würde nicht sagen, dass man keinen 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.
Dmitry Grigoryev
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.