2013-06-18 6 views
0

меня есть, среди прочих, следующие строки в функции петли:функция Ардуино мешая петли кода()

item = String(buffer); 
Serial.println(item); 

где элемент представляет собой строку и буфер массив символов. Это отлично работает, пока я не добавить функцию в конце файла (за пределами функции цикла):

void storeData(String item){ 
    Serial.println("StoreData"); 
    for (int k=0; k<11; k++){ 
    Serial.print("*"); 
    if(item == products[k]){ 
     items[index] = names[k]; 
     index++; 
     Serial.print("\n"); 
     Serial.print(item); 
     Serial.print("\t"); 
     Serial.print(names[k]); 
    } 
    } 
} 

который сравнивает строку item в список значений и сохраняет соответствующее имя, если значение найдено. Когда я добавить этот код в конце концов, даже если я не позвоню на функции, выход преобразования становится:

978973103 Á 
9789731030418 

Если первое значение является некорректное преобразование и второй из них является значение от buffer.

Что может произойти? Я перезапустил и переработал и переделал все с нуля снова и снова.

+0

Если проблема с памятью (нехватка памяти) отсутствует, вы уверены, что item = String (buffer) копирует массив с завершающим нулем? Быстрая печать сразу после назначения должна прояснить это. Если элемент верен, как показывают другие, библиотека MemoryFree хороша для использования, по крайней мере во время разработки, чтобы следить за доступной памятью. – user2019047

+0

Массив содержит не более 14 символов (цифр). Он напечатан правильно ('9789731030418'), в отличие от преобразования, которое выходит из строя' 978973103 Á '... – FloIancu

+0

У меня была странная проблема в то время, когда я передал буфер символов функции, и состояние программы исчезло бы после какое-то время. Я удалил буфер char из вызова функции и использовал его как глобальную переменную, и все было в порядке. Я также читал, что тип String имел некоторые ошибки распределения в более ранних версиях, какая версия является вашим компилятором? – user2019047

ответ

1

Возможно, вы исчерпали 2K SRAM. Массивы строк могут быстро использовать его.

Кроме того, я рекомендую использовать функцию F(), так как не использовать ОЗУ RAM для константы. например Serial.println(F("StoreData");

Последние IDE показывают ожидаемое использование ОЗУ. но это предположение. Если он даже близко, то, вероятно, проблема. Я использую следующие MemoryFree library в определенных точках кода, чтобы показать высокую воду.

+0

Я рассмотрел вопрос с ОЗУ, но как это может быть? A для 12 итераций и если это даже не называется? – FloIancu

+0

Это была, по сути, оперативная память. Выяснилось, что это GLCD, который я использую. Только эскиз библиотеки и inits составляют 5k. Я даже не могу себе представить, насколько сильно он управляет ОЗУ. Спасибо, что нашли время ответить! – FloIancu

0

Так как элемент является строкой. Я думаю, вы можете попробовать использовать

Serial.println(item); 

вместо

Serial.print(item); 

в вас функция StoreData. Также аналогично для других строк