Почему Serial.print печатает только значение от 0 до 84 для массива целых чисел длиной 100?

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);
}

, 👍7


1 ответ


27

Это происходит потому, что вы используете exit(0). Это отключает прерывания и переходит в бесконечный цикл. Однако последовательная печать сначала помещает символ в буфер, а затем каждый символ по очереди извлекается из этого буфера и отправляется через последовательный порт.

Все было нормально до тех пор, пока вы не использовали exit(0);, а то, что осталось в последовательном буфере для отправки, никогда не будет отправлено, потому что прерывания отключены.

На самом деле, нет никаких причин использовать exit() на микроконтроллере — в конце концов, куда он может «выйти»? Операционной системы, в которую можно выйти, нет. Поэтому он делает то, что ближе всего к полному отсутствию каких-либо действий, насколько это возможно.

Вместо этого, если вы хотите «остановить» свою программу, следует использовать простой while(1);, который позволит прерываниям по-прежнему срабатывать.

В качестве альтернативы, если вы действительно хотите использовать exit(), вам следует сначала сбросить последовательный порт:

Serial.flush();

Эта функция будет блокироваться до тех пор, пока буфер передачи не будет полностью очищен прерыванием и последний байт не покинет регистр сдвига TX UART.

,