Не выходит из функции
- Войдите на сайт для отправки комментариев
Сб, 20/11/2021 - 22:24
Добрый день, подскажите такой вопрос: код написан, почти полностью работает, да не профессионально, но для начала пойдёт.
Ситуация такая: при посыле сигнала с телефона, программа должна переходить в функцию loop(), serial.print я проверил, она срабатывает как надо, но почему-то обратно возвращается в эту функцию. В остальном коде, все работает, а в этой отдельной функции не хочет. Пробывал без case, пробывал через goto - срабатывает но на loop() не переходит.
void rassvet() { int s; ras = EEPROM.read(9); RTC.read(tm); int b = tm.Minute; int sek = tm.Second; switch (ras) { case 0: inc = 0.142; dim = ((b - 30) * 60 + sek) * 0.142; for (dim; dim > -1; dim) { analogWrite(9, dim); analogWrite(10, dim); analogWrite(11, dim); delay(1000); Serial.println(dim); dim += inc; if (Serial.available() > 0) { if (Serial.find(target)); s = 5; break; } if (dim >= 255) { digitalWrite(9, HIGH); digitalWrite(10, HIGH); digitalWrite(11, HIGH); break; } } Serial.println("Вышел с фор"); break; } if (s >= 5) { Serial.println("Луп"); setup(); analogWrite(10, EEPROM.read(0)); analogWrite(11, EEPROM.read(1)); analogWrite(9, EEPROM.read(2)); delay(10000); } else { Serial.println("Авто"); Auto(); } }
Как оно может туда переходить, если у тебя эта функция не определена?
Извините, я уже пробывал в Setup() выйти. Счас подправлю. Но все-равно даже в Setup() не выходит
А почему он должен переходить в loop() ?
Потому что вызывается setup() ?
Ну так после выполнения вызванной функции обычно программа возвращается обратно.
С чего вы взяли, что при вызове setup(), после выполнения функции будет исполнятся loop() ?
Извините, должно быть так
Я внизу вставил код, который должен отработать, я вчера пробывал по всякому и в loop() и в setup(). Если бы она вышла в Setup(), то после сразу начал бы выполняться loop(), правильно же? Но происходит так, при отправке команды, программа переходит в if, ставит значение на портах, а дальше начинается выполнение её заново
А для чего это вообще ?
Если что есть while....
А вообще нужно как-то проектировать код перед тем как начинать писать. Несколько абсурдно вызывать основной цикл из функции. Обычно основной цикл крутится всегда, а для выхода из вызванной функции используется return.
Я внизу вставил код, который должен отработать, я вчера пробывал по всякому и в loop() и в setup(). Если бы она вышла в Setup(), то после сразу начал бы выполняться loop(), правильно же? Но происходит так, при отправке команды, программа переходит в if, ставит значение на портах, а дальше начинается выполнение её заново
Нет не правильно .
Условно код выглядит так:
int main(void){
//те действия которые требуется выполнить при запуске они будут функцией setup() (нет)
//while(1)
for(;;){
//Основной цикл. Так называемый Loop
}
}
Так что это даже не функции . Это их визуальная реализация в arduinoIDE.
В конечном итоге программа перед компиляцией их выкинет и заменит на int main и for(;;)
это для того, чтобы программа работала в авто-режиме и режиме ручном. В loop() она получает команды через bluetooth, а если она переходит в функцию Auto(), там она и остаётся и выйти с неё никак нельзя, кроме того, чтобы при получение команды, она переходила в loop() и соответственно могла работать в ручном режиме.
Да, это кусочек кода из всей программы, всю программу вы захейтите, так как она написана коряво (не профессионально).
а хотя, вот вся программа, много чего лишнего в ней, как только получиться решить проблему с этим, то буду убирать всё лишнее
Вот и должно быть при заходе в функцию авто:
void Auto(){
while(1){
if(какое то условие)return;
}
}
Во всей программе, в функции Auto() все работает а вот в функции rassvet() нет, и не могу понять почему
Не пори чушь, пожалуйста.
Не пори чушь, пожалуйста.
Да чушь, но пусть лучше новички думают о том, что это так и есть, чем плодят ненужные рекурсии.
Специально для rkit.
Описание того как делать не стоит:
Программа в Ардуино выглядит так:
Т.е. при вызове в теле цикла loop() цикла loop() мы творим лютую дичь. И так делать не стоит.
Т.е. при вызове в теле цикла loop() цикла loop() мы творим лютую дичь. И так делать не стоит.
Какая то лютая дичь. Какой цикл loop в теле цикла loop()???
Цыкал цыкал мотоцикл ...
должно быть так
Нет, так не должно быть.
Функцию loop() вызывать нельзя. Тому, кто точно знает что делает, может и можно иногда, но я не могу себе представить случая, когда это оправдано. Вам же вызывать её нельзя никогда. Если Вам нужно её вызвать, значит, Вы чего-то не понимаете.
должно быть так
Нет, так не должно быть.
Функцию loop() вызывать нельзя. Тому, кто точно знает что делает, может и можно иногда, но я не могу себе представить случая, когда это оправдано. Вам же вызывать её нельзя никогда. Если Вам нужно её вызвать, значит, Вы чего-то не понимаете.
оууу , да тут у нас исторический момент. на форуме что то запретили :D
Нет. Ничего не запретили. Просто поставили точки над i. Функция loop определена в системе и вызывается системой в бесконечном цикле. Это если следовать правилам ардуины и использовать setup и loop так, как намечено разработчиками. Из loop можно выйти из любой точки и попасть снова в начало loop. Это вроде как вызвать loop c начала. Но вот самому вызвать loop это сделать петлю на стеке. Несколько раз получится, а потом ...
Всем спасибо я разобрался сам. Внимательно почитал интернет и понял, что в моём случае, в функции Auto() я вызываю другую функцию, которая выполняется и прервать я её не могу. В итоге вопрос решился. Всем спасибо, если интересно я скину код
понял, что в моём случае, в функции Auto() я вызываю другую функцию, которая выполняется и прервать я её не могу.
фраза попахивает бредом...
Если вы сами вызываете функцию, то что мешает ее прервать? ... или контроль над ардуиной захватили инопланетяне, или вы опять чего-то не поняли...
А в Auto() вы вызываете Auto() - это называется рекурсия. Не стоит это делать без четкого понимания. Мне кажется, вам до этого понимания еще 2-3 года усиленного изучения С.С++
Denisblr, вам выше верно написали - прежде чем садиться за код, надо спроектировать на бумажке логику программы.
Логика вашего кода в корне неверная. Даже если отвлечься от попыток вызывать служебные функции setup() и loop() - что, как надеюсь вам уже обьяснили, делать нельзя - вы и со своими функциями обращаетесь неправильно. У вас есть функции Auto() rassvet() zakat(). Вы из Auto() вызываете rassvet(), а оттуда снова Auto() и так далее. Такая "логика" кода однозначно ведет к зацикливанию и зависанию программы через 3-5 стадий.
Если вы хотите из ФУНКЦИИ_1 вызвать ФУНКЦИЮ_2, а потом ФУНКЦИЮ_3 - то в общем случае надо СНАЧАЛА ВЕРНУТСЯ из ФУНКЦИИ_2 в первую, а уже потом вызывать ФУНЦИЮ_3
Выберите одну из функций "главной", например вашу Auto()/ Вызвали из нее zakat(), отработали, ВЕРНУЛИСЬ в Auto() и из нее пошли в rassvet. А иначе у вас будет полная ерунда
Работает :(
Работает :(
Шутка не смешная. А в подобной теме, так и вредная, т.к. ТС стопудово не поймёт, что это шутка и воспримет серьёзно. Запустит, увидит, и будет считать, что так можно.
Я уже с этим разобрался. Теперь у меня работает все. Основная функция у меня auto(), из неё вызывается rassvet и zakat, возврат на Auto реализовал через go to, у меня были сомнения что через return 0, будет все выходить в case 0. Но почему у меня тогда в авто происходит прерывание выполнения кода по отправке значения и программа выходит в loop()?
Я уже с этим разобрался. Теперь у меня работает все. Основная функция у меня auto(), из неё вызывается rassvet и zakat, возврат на Auto реализовал через go to, у меня были сомнения что через return 0, будет все выходить в case 0. Но почему у меня тогда в авто происходит прерывание выполнения кода по отправке значения и программа выходит в loop()?
показывайте новый код, иначе разговор ни о чем
Работает :(
Шутка не смешная. А в подобной теме, так и вредная, т.к. ТС стопудово не поймёт, что это шутка и воспримет серьёзно. Запустит, увидит, и будет считать, что так можно.
Это не шутка. Так можно.
Это не шутка. Так можно.
А-а-а! Даже так!
Ну, ладно, подождём, пока в очередной версии IDE в Platform.txt напишут опцию -O1 вместо нынешней -Os. Тогда, видимо, "нельзя" станет :-)
Политота удалена. Следите за базаром.
Вот весь код, осуждайте
2000 строк и вредные goto, работа с EEPROM как с переменными
Йухня , переделывай.
Раз Вы такой умный, ну-ка предложите свой вариант, а если не EEPROM, то где хранить значения при отключении питания?
Раз Вы такой умный, ну-ка предложите свой вариант, а если не EEPROM, то где хранить значения при отключении питания?
Как где ? в EEPROM.
Но их от туда нужно читать только при запуске, а не использовать в качестве переменных.
Сдается мне, что последние ~1,5к строк можно заменить функцией на пару десятков строк.
Скорее даже 1,8к...
Раз Вы такой умный, ну-ка предложите свой вариант, а если не EEPROM, то где хранить значения при отключении питания?
Сделать так, чтобы питание не прерывалось.
пиздец какой-то...
вы про циклы не слыхали вовсе?
например вот эта портянка
записывается в 2 строки
не умея элементарных вещей - беретесь писать код в 2000 строк. Кому и зачем этот шлак нужен, мусора в инете и так хватает
Ну так, "Ардуино для домохозяек" же ж.(
сдается мне, что тут ничего менять не надо. Код - сразу в помойку, написать заново и легче и правильнее, и всего кода будет строчек 100
Вы все такие умные я посмотрю, так напишите. Образец у ВАС имеется!!!!!
вот это тоже хорошо :)
нет, это уже я сослепу не туда смотрю
Вы все такие умные я посмотрю, так напишите. Образец у ВАС имеется!!!!!
добро пожаловать в раздел "ищу исполнителя". Хорошую цену предложишь - напишем.
Denisblr - за время пока ты набивал по сотне подряд одинаковых блоков чтения и записи в ЕЕПРОМ - могу бы пол-учебника по Си прочитать... и выучить
Вот весь код, осуждайте
Осуждаю! Хотя и не читал.
Вы все такие умные я посмотрю, так напишите.
Нет, не настолько :-(
Образец у ВАС имеется!!!!!
Спасибо! Будем использовать как образец.