Если я попытаюсь приостановить свою функцию цикла, мой экран вывода начнет печатать мусор
Я работаю над платой 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();
}
@Vitthal Inani, 👍0
Обсуждение2 ответа
В вашей программе нет ничего очевидного, но что произойдет, если вы сделаете ее немного более "нормальной"?
Обычно просто ничего не делайте после 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, в сгенерированный код было включено огромное количество вредоносных программ. Между вызовами метода цикла вполне могут быть другие вещи, которые должны происходить в фоновом режиме. Но вы предотвращаете это с помощью своего бесконечного цикла.
Однако явно что-то происходит в фоновом режиме, потому что ваш бесконечный цикл каким-то образом генерирует, как вы выразились, "мусор".
Вы не опубликовали информацию о библиотеке датчиков или ее методах. Могут ли там быть какие-то побочные эффекты? К каким контактам подключается датчик?
Платы на базе ESP8266 не любят слишком долго оставаться без связи, не имея возможности обслуживать какие-либо задачи, связанные с WiFi.
Некоторое время(1){} эффективно загружает процессор на неопределенное время. Это вызывает сброс сторожевого таймера, и последовательный порт будет печатать мусор (на самом деле это загрузочное сообщение чипа). Вы не показываете свои серийные настройки.
ESP8266 может обслуживать свои задачи WiFi в конце цикла(), во время задержки() или при вызове функции yield().
Я бы посоветовал добавить функцию delay() или yield() в блок while, чтобы решить проблему.
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
Я не вижу числа 50 нигде в вашем коде. Что произойдет, если вы не попытаетесь поставить его на паузу? Тогда вывод в порядке?, @Nick Gammon