Значения Nano V3 «перезаписываются» случайным образом
Когда я присваиваю глобальную переменную определенному значению внутри if-блока, оно меняется на другое значение в следующем операторе. Каким-то образом адрес переменной перезаписывается каким-то другим процессом. Он также не останавливается на значении 1, это происходит со следующими переменными, которым тоже присвоено другое значение. Переменные не определены подряд, но должны быть близки. Я уже установил более новую версию Arduino IDE, никаких изменений. Пример:
menuActive=1;
Serial.print(menuActive);
насколько я видел до сих пор, дает результаты в диапазоне от 40 до 57. Дальнейшие действия всегда присваивают ТО ЖЕ значение следующим переменным, которые я назначаю после этого. Кто-нибудь знает, что может вызвать это? У меня мало памяти для локальных переменных? Это сообщение компиляции:
Sketch uses 21790 bytes (70%) of program storage space. Maximum is 30720 bytes.
Global variables use 1454 bytes (70%) of dynamic memory, leaving 594 bytes for local variables. Maximum is 2048 bytes.
изменить:
Как я уже сказал, это 21 тысяча кода. Но я покажу вам ту часть кода, которая работает неправильно:
while ((digitalRead(rotSwPin) == 0) && lpress <= 200) {
delay(10);
lpress++;
if (lpress > 200) {
menuActive++;
menuLvl=0;
menuPos=0;
subPos=0;
}
}
Обычно я использую MenuActive=1. В фигурных скобках это по-прежнему 1, дальше оно меняется. Возможно, измените байтовое значение на логическое.
@hoekbrwr, 👍0
Обсуждение1 ответ
Я нашел проблему. Я мог видеть, что ложное значение — это код символа минуты, которую я показываю. Я показываю часы и минуты, и там было объявление, в котором не хватало 3 символов для строки, которую я получил в результате для часов, добавленных к минутам. Да, это было повреждение памяти. Поэтому будьте очень осторожны, чтобы определить достаточное количество мест для ваших C-строк, включая 1 дополнительный для 0. Если у вас не так мало оперативной памяти, то еще несколько символов не принесут вреда, концом строки будет символ перед 0 в Память. Когда происходят странные вещи, начните обращать внимание на это дело!
- avrdude ser_open() can't set com-state
- Не могу загрузить скетч в Arduino Nano
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- Проблема с Arduino Nano 33 IOT
- Можно ли обновить загрузчик Arduino (Nano) через себя и Arduino IDE или требуется ISP?
- Не удалось преобразовать «digitalWrite(8u, 1u)» из «void» в «bool»
- Как отладить "No device found on cu.usbserial, An error occurred while uploading the sketch"
- Невозможно загрузить код на Arduino Nano.
Для меня это похоже на переполнение буфера., @Majenko
Согласованный! Но где я могу найти распределение памяти в файле/списке, чтобы понять, какая переменная перезаписывает?, @hoekbrwr
Вы не сможете этого сделать, если не создадите файл «карты», для которого вам необходимо изменить параметры компилятора в файлах конфигурации IDE. Проверьте свой код на наличие используемых вами массивов и убедитесь, что вы не пытаетесь использовать больше, чем следует. Одним из распространенных случаев неправильного использования является объявление
int foo[10]
, а затем попытка использоватьfoo[10]
в качестве среза., @MajenkoУчитывая диапазон чисел, который он вам дает, скорее всего, это массив символов, в который вы печатаете числа, возможно, со знаками препинания, такими как скобки., @Majenko
или покажите свой код, и кто-нибудь заметит проблему, @Juraj
Спасибо за ваши предложения, но я уже тщательно проверил эти вещи. Я думаю перейти на Eclipse для этого проекта Arduino и узнать больше путем отладки?, @hoekbrwr
Как я уже сказал, это 21к кода. Но я покажу вам ту часть кода, которая работает неправильно: <код> while ((digitalRead(rotSwPin) == 0) && lpress <= 200) { Delay(10);lpress++; if (lpress > 200) {menuActive++;menuLvl=0;menuPos=0;subPos=0;} } </код> Обычно я использую MenuActive=1. В фигурных скобках это по-прежнему 1, дальше оно меняется. Возможно, измените байт на bool., @hoekbrwr
Если ваша программа повреждает память (что, по-видимому, имеет место в данном случае), часть кода, которая ведет себя неправильно, может быть довольно далеко от той части, которая вызывает повреждение памяти. В коде, который вы здесь показываете, нет ничего плохого. Ваша проблема заключается в какой-то части кода, которую вы не показываете. Никто не сможет вам помочь, не видя ошибки., @Edgar Bonet
Я нашел проблему. Я мог видеть, что ложное значение — это код символа минуты, которую я показываю. Я показываю часы и минуты, и там было объявление, в котором не хватало 3 символов для строки, которую я получил в результате для часов, добавленных к минутам. Да, это было повреждение памяти. Поэтому будьте осторожны, определите размеры достаточного количества мест для ваших строк, включая 1 дополнительную вместо 0., @hoekbrwr
@hoekbrwr Возможно, вы захотите опубликовать это как ответ, а не как комментарий., @sempaiscuba
Комментарии не рекомендуются к любому из следующих действий: [Ответ на вопрос или предоставление альтернативного решения существующего ответа; вместо этого опубликуйте фактический ответ (или отредактируйте, чтобы расширить существующий)](https://arduino.stackexchange.com/help/privileges/comment); Вместо этого не стесняйтесь опубликовать ответ. Спасибо., @Greenonline