Если я попытаюсь приостановить свою функцию цикла, мой экран вывода начнет печатать мусор

Я работаю над платой Wemos R1 D2 с лазерным датчиком VL53L0X. Мне нужно остановить мою программу после вычисления среднего значения 50 показаний, но как только я пытаюсь использовать while(1) { } или любой другой метод, мой вывод производит мусор.

void loop()
{
  float initial=0,inside=0,outside=0,sum=0,x;
  for (int i = 0; i < 10; i++) {
    x = sensor.readRangeSingleMillimeters();
    if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
    sum = sum + x;
    Serial.print("Initial Reading: ");
    Serial.println(sum);
  }
  while(1) {};
  Serial.flush();
}

, 👍0

Обсуждение

Я не вижу числа 50 нигде в вашем коде. Что произойдет, если вы не попытаетесь поставить его на паузу? Тогда вывод в порядке?, @Nick Gammon


2 ответа


0

В вашей программе нет ничего очевидного, но что произойдет, если вы сделаете ее немного более "нормальной"?

Обычно просто ничего не делайте после 10-го (или 50-го) раза вместо бесконечного цикла, который вы выполняете в данный момент.

int cntr = 0;
float initial=0,inside=0,outside=0,sum=0,x;

void loop()
{
  if (cntr < 10 /* or 50 */) {
    cntr++;
    x=sensor.readRangeSingleMillimeters();
    if (sensor.timeoutOccurred()) {
      Serial.print(" TIMEOUT");
    }
    sum=sum+x;
    Serial.print("Initial Reading: ");
    Serial.println(sum);
  }
}

Причина, по которой я предлагаю это, заключается в том, что когда я попробовал плату ESP, в сгенерированный код было включено огромное количество вредоносных программ. Между вызовами метода цикла вполне могут быть другие вещи, которые должны происходить в фоновом режиме. Но вы предотвращаете это с помощью своего бесконечного цикла.

Однако явно что-то происходит в фоновом режиме, потому что ваш бесконечный цикл каким-то образом генерирует, как вы выразились, "мусор".

Вы не опубликовали информацию о библиотеке датчиков или ее методах. Могут ли там быть какие-то побочные эффекты? К каким контактам подключается датчик?

,

3

Платы на базе ESP8266 не любят слишком долго оставаться без связи, не имея возможности обслуживать какие-либо задачи, связанные с WiFi.

Некоторое время(1){} эффективно загружает процессор на неопределенное время. Это вызывает сброс сторожевого таймера, и последовательный порт будет печатать мусор (на самом деле это загрузочное сообщение чипа). Вы не показываете свои серийные настройки.

ESP8266 может обслуживать свои задачи WiFi в конце цикла(), во время задержки() или при вызове функции yield().

Я бы посоветовал добавить функцию delay() или yield() в блок while, чтобы решить проблему.

,