Не удалось прервать "пустой цикл"

Я загрузил в Uno пример скетча, который появился при установке программного обеспечения Arduino.

void setup() {
   Serial.begin(9600);
}


void loop() {

  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  delay(1);       
}

С этого момента индикатор TX горит постоянно. Он остается включенным даже после его сброса. Как завершить void loop, чтобы индикатор TX погас.

, 👍-1

Обсуждение

Остановить вывод через последовательное соединение., @Ignacio Vazquez-Abrams

Мне нужно настроить многозадачность в цикле, чтобы я мог сделать снимок данных с SD-ридера., @joe

НАСТОЯТЕЛЬНО рекомендуем начать с загрузки примера программы Blink и начать с нее. Затем измените его в соответствии с вашими потребностями. Что касается вашей маленькой программы, ваша задержка составляет всего 1 миллисекунду. С таким же успехом у вас его может и не быть, потому что Serial.println занимает больше времени. Измените его на 5000 на 5 секунд, может быть. Кроме того, вы никогда не устанавливаете для контакта A0 тип INPUT. Но сначала вернитесь к Blink и попробуйте ходить (цифровой), прежде чем пытаться бежать (аналоговый)., @SDsolar

Я голосую за то, чтобы закрыть этот вопрос как не по теме из-за его возраста и отсутствия полезного описания в заголовке., @SDsolar


5 ответов


6

Индикатор TX горит, потому что этот скетч периодически выводит значение аналогового контакта 0 на последовательный порт. Кажется, что светодиод горит постоянно, потому что задержка между двумя вызовами Serial.println() составляет всего прибл. 1 мс.

Если вы замените 1, например, на 1000, индикатор TX должен мигать один раз в секунду. Запустите последовательный монитор в Arduino IDE, чтобы увидеть передаваемые аналоговые значения. Удалите вызовы Serial., чтобы полностью удалить функциональность последовательного порта.

Возможно, вы захотите прочитать документацию по loop() и delay().

,

8

Подразумеваемый вопрос заключается в том, как отключить светодиод Tx, на который уже дан ответ, и, вероятно, это ответ, который вы ищете. Но вопрос, который вы задали, заключается в том, как завершить функцию loop(). Чтобы не быть педантичным, но пояснить использование loop, простой ответ: "вы не можете". loop() вызывается из вечного цикла в основной программе C/C++, функции main(), поэтому возврат из нее осуществляется либо с помощью return или при достижении финального закрытия } вызывает повторный вызов loop(). Это сделано намеренно, так как функция main() во встроенной системе никогда не должна возвращаться, поэтому она должна постоянно перезапускать прикладную программу.

Обновление (поскольку этот вопрос только что появился на первой странице, я добавлю к своему ответу следующее):

loop() непрерывно считывает и печатает. Если вы хотите, чтобы этот код выполнялся только один раз, вы можете добавить setup() и оставить loop() пустым. Затем скетч инициализировал последовательный вывод, считывал аналоговое значение, печатал его — один раз — с последующим вводом пустого loop() и оставался там до отключения питания.

Способ однократного выполнения функции цикла состоит в том, чтобы написать бесконечный цикл в конце, чтобы loop() никогда не возвращался и, следовательно, никогда не выполнялся повторно:

void loop() {

  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  delay(1);

  while(1)
     ;
}
,

2

Поскольку вопросы об отключении светодиода и характере выхода из loop были даны, я также отвечу на вопрос, к которому они оба ведут:

Если общее намерение состоит в том, чтобы «выключить» MCU, помимо отключения питания, его можно перевести в спящий режим. режим.

В зависимости от того, как вы настроите MCU перед переходом в спящий режим, ему даже может быть разрешено выйти из спящего режима при дальнейшем обмене данными USART.

,

2

Не пишите в цикл() код, который должен выполняться всего несколько раз. Или используйте счетчик. Или внешняя кнопка. Для постоянного освещения увеличьте задержку между вызовами.

,

Не могли бы вы уточнить, как делать то, что вы говорите в этом ответе?, @The Guy with The Hat


-1

Если ваш вопрос заключается в том, как остановить выполнение вашего кода цикла void через некоторый интервал, я могу назвать 4 решения:

1. Если вы хотите, чтобы цикл Void() выполнялся только один раз (или заданное количество раз, используя цикл for), вы можете использовать "exit(O);" в конце цикла Пустоты. т.е.

Void loop(){
         //код
         exit(0);
         }

Отказ от ответственности: этот вариант может работать не со всеми платами Arduino, но он прекрасно работает с моей Arduino UNO.

2.Еще один способ – сохранить функцию "Void loop()" пустой и поместите весь свой код в функцию настройки Void.

  1. используйте цикл void в конце цикла Void. Например

    void loop(){ //код while(1){ // бесконечный цикл }

Arduino останется в бесконечном цикле и не сможет повторно запустить цикл Void.

  1. Создайте собственную функцию и вызовите ее из окна "Void Setup()" Например

     Void setup(){
      myfunc();   // вызов вашей функции
     }
      Void myfunc(){
    //Код функции, которую вы хотите повторить только заданное количество раз
     }
     Void loop(){
     }
    

Надеюсь, кому-то это будет полезно.

,

Есть ли веская причина, чтобы разогреть этот старый вопрос? Кстати: есть разница между void и void, @DataFiddler

@DataFiddler - Да, ответ NFG. Весь Q + A должен быть удален или, по крайней мере, закрыт, поскольку очевидно, что ОП никогда не отметит его как ответ после 8 лет., @VE7JRO