Переменные сбрасываются.
- Войдите на сайт для отправки комментариев
Здравствуйте, форумчане!
Вообщем возникла небольшая проблемка.
Предыстория: Собираю устройство на базе arduino nano, которое будет по смс сообщениям управлять реле.
Суть проблемы: Допустим, я отправляю на устройство "On1" (включаю свет) получаю ответ, потом отправляю "On2" (включаю обогрев) получаю ответ, далее запрашиваю состояние смской "sost" и получаю ответ:
"Vkluchen obogrev, Vkluchen svet, Otkluchen nasos, Otklucheno rele, T = 26.63"
Дальше я включаю насос смской "On3", и отключаю свет смской "Off1", всё нормально отключается.
Снова запрашиваю состояние смской "sost" и получаю ответ:
"26.63"
Приходит только значение температуры с датчика.
Кто-нибудь знает в чём проблема и как её решить?
Вот кусочек скетча
getsms(); // получаем непрочитанную СМС static String sostObogrev="Otkluchen"; static String sostOsv="Otkluchen"; static String sostNasos="Otkluchen"; static String sostRele="Otklucheno"; if (input_string=="Off1"){digitalWrite(Rel1, LOW);sms.SendSMS(n1, "Otkluchen svet");sostOsv="Otkluchen";} if (input_string=="Off2"){digitalWrite(Rel2, LOW);sms.SendSMS(n1, "Otkluchen obogrev");sostObogrev="Otkluchen";} if (input_string=="Off3"){digitalWrite(Rel3, LOW);sms.SendSMS(n1, "Otkluchen nasos");sostNasos="Otkluchen";} if (input_string=="Off4"){digitalWrite(Rel4, LOW);sms.SendSMS(n1, "Otklucheno rele");sostRele="Otklucheno";} if (input_string=="On1"){digitalWrite(Rel1, HIGH);sms.SendSMS(n1, "Vkluchen svet");sostOsv="Vkluchen";} if (input_string=="On2"){digitalWrite(Rel2, HIGH);sms.SendSMS(n1, "Vkluchen obogrev");sostObogrev="Vkluchen";} if (input_string=="On3"){digitalWrite(Rel3, HIGH);sms.SendSMS(n1, "Vkluchen nasos");sostNasos="Vkluchen";} if (input_string=="On4"){digitalWrite(Rel4, HIGH);sms.SendSMS(n1, "Vklucheno rele");sostRele="Vklucheno";} // if (input_string=="T"){sms.SendSMS(n1, sendsms);memset(n,0,20);} if (input_string=="sost") { smsContent=(sostObogrev+" obogrev, "+sostOsv+" svet, "+sostNasos+" nasos, "+sostRele+" rele, T = "+String(sensors.getTempCByIndex(0))); smsContent.toCharArray(sendsms,160); sms.SendSMS(n1, sendsms); }
Ой Вы знаете - у меня если тут нажать то там болит а если нажать там то чешется тут. Вот вам фотография мизинца правой ноги подскажите пожалуйста какую таблетку мне пить.
1. Скетч нужен полностью.
2. Заодно поставьте проверки выделилась ли память под String'и и печатайте в Serial результат. Протокол (что в сериал печатается) тоже нужен.
Ой Вы знаете - у меня если тут нажать то там болит а если нажать там то чешется тут. Вот вам фотография мизинца правой ноги подскажите пожалуйста какую таблетку мне пить.
Вроде ясно изложил проблему, что непонятного?
Вроде ясно изложил проблему, что непонятного?
Много чего непонятного. Например, как и где описана smsContent? Да и много чего. Код нужен полностью. И про проверку памяти я Вам уже написал. Вставьте сразу, всё равно потом придётся вставлять.
А где проверка на то, память выделилась? Я Вам об этом два раза писал! Вот у меня ощущение, Что в строке №94 не хватает памяти. Поставьте наконец проверку, сколько просить-то можно.
И, да, с памятью Вы работаете варварски. Неудивительно, если Вам её впрямь не хватает. Чего только стоит совершенно ненужный глобальный массив sendsms. Он не нужен от слова "совсем", а жрет почти 8% всей имеющейся памяти! Переменная smsContent используется ровно в одном месте, но объявлена она зачем-то глобальной и даже не чистится, а постоянно держит в себе свой огромный контент! Ну и много такого.
В общем ставьте проверку хватило памяти в строке №94
Ох, кстати, а чё за ардуина-то? Сколько хоть у Вас памяти-то? "Понятно он всё написал" :-)
ЕвгенийП, а как проверить, если не секрет, выделилась ли память под String?
Arduino nano
Ах, да, сорри - Nano - это я пропустил
Получается, smsContent и sendsms в нужных местах нужно делать static?
ЕвгенийП, а как проверить, если не секрет, выделилась ли память под String?
Получается, smsContent и sendsms в нужных местах нужно делать static?
1. sendsms не нужен вовсе. Надо только не делать toCharArray, а брать готовый массив символов прямо из самой строки методом c_str
2. smsContent не нужно делать статик. Её нужно просто описать (не статик) в месте использования. Зачем ей сохранять своё значение, если Вы его всё равно каждый раз заново формируете?
Принято, спасибо.