Работа с картой microSD

Друзья-товарищи, добрый вечер.
Может кто сочтет возможным помочь/подсказать…
Делаю программку, которая пишет данные с датчика атмосферного давления на флэш-карту.
Сделал тестовую упрощенную, все работало. Делаю более причесанную.
Неожиданно столкнулся с проблемой, которую не могу решить второй день…
Суть:
-работа с картой по команде SD.begin(4) начинается нормально.
-а открытие файла по команде File dH=SD.open(“proba.txt”, FILE_WRITE)
выдает ошибку (dH=0) хотя фактически файл PROBA.TXT на карте создан (но пустой). И потом в него ничего не пишется…

Продолжу (отправил сообщение по неопытности недописанным).
Странность в том, что выдираю кусок кода “про карту” в отдельный скетч - и все работает!
А в большом коде, где и датчик давления обрабатывается, - не работает.
Датчик давления BMP180

Что говорит компилятор об объеме используемой памяти в том и другом случае?

В чистовой программе (большой):
Скетч использует 20008 байт (65%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1799 байт (87%) динамической памяти, оставляя 249 байт для локальных переменных. Максимум: 2048 байт.
В малой “проверочной”
Скетч использует 12430 байт (40%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1171 байт (57%) динамической памяти, оставляя 877 байт для локальных переменных. Максимум: 2048 байт.

Регистр символов правильный? Т.е. файл назван заглавными буквами, а обращаетесь к нему строчными? Так это разные файлы, неудивительно, что открыть не получается

Вообще про регистр тоже для меня загадка. Я к нему на чтение не обращаюсь, только пишу, анализ потом на ПК.
Странно для меня то, что я задаю название файла строчными, а на карточке он прописными.

В тестовой короткой программе тоже так происходит (имя файла - прописными), но при этом записи в файл нормально выполняются.
Т.е. замена строчных на прописные - не моя ошибка, это так само делается почему-то. Я думал это нормально… Нет?

Я хочу сказать что файл собственно и создается на чистой флэшке заново и его имя я задаю однажды. А потом обращаюсь к нему для записи не по имени файла а по имени объекта:
dH.print(millis());
и так далее.
Но проблема в том что уже после выполнения операции по открытию файла ответ “неуспешно”.
т.е. вот эта конструкция:
‘’’ dH=SD.open(“proba.txt”, FILE_WRITE);
Serial.println(dH);‘’’
отвечает мне что dH=0
а в тестовой программке dH=1 и записи в файл пишутся…

Нет. Регистр имеет значение

В exfat не имеет.

Опа! Пока перписываюсь - пробую продолжать тыкаться туда-сюда.
Вроде заработало! сейчас контрольное время записи (3 мин) пройдет - выну карту и посмотрю что там…
Что сделал??? Вы не поверите…

Вот отсюда и пляшите. Поставьте везде контроль памяти и смотрите.

Почему? Поверим. Глюки с памятью непредсказуемы и могут исчезать/ снова появляться по любым внешним воздействиям.

Не. как всегда ошибки надо искать у себя. Arduino nano конечно своеобразно на них отреагировала… тем не менее.
Суть. У меня организован в программе флажок типа байт. Там храню признак “есть/нет” (1/0)
И далее по ходу проверяю состояние флажка
if(x)…
Так вот там вместо условия fl==1 было прописано fl=1
Как это связано с выполнение операции открытия файла? да вроде никак!
Но после исправления результат операции открытия файла стал “успешным”.
Дальше полезли другие проблемы (нормальный процесс отладки нового скетча…), но через этот шаг я проскочил. Продолжу уже завтра…

1 лайк

Ну, этого мы никогда не узнаем, т.к. код секретен и мы его не видели.

А вообще, перечитайте последнее предложение в моём предыдущем посте. Если надо - несколько раз.

Имеете в виду вот это?

Это я пока не знаю “как”… Новичок! Но спасибо буду посмотреть…
Или Вы имеете в виду возможные ошибки памяти? это тоже проверю на другом экземпляре. Не китайском - есть у меня такой…

А код не секретен… но целиком достаточно велик и я пока не видел необходимости грузить им чужие умы… Но если потребуется для пользы дела - незамедлительно приложу…

При длине имени файла до 8 символов имя не регистрочувствительное.

249 байт - это совсем не много. С большой вероятностью программе просто не хватает памяти. Кстати, странно, что об этом нет диагностики, в старых версиях такая диагностика присутствовала.

Какого рода объекты программы дадут наиболее эффективную экономию памяти?
Переменные типа float? long?
У меня тех и других совсем немного: 5+1, еще byte,char (всего 3)
объекты для флэшки и для датчика
Одна локальная int
По-моему это совсем немного. Чем же занята память? библиотечными объектами?

А! ну еще по ходу используется контрольный вывод в IDE используется (Serial.print)

Ну где-то же 1800 байтов статических переменных Вы насобирали…
Обычно наиболее расточительны с точки зрения расходуемой памяти те или иные варианты текстовой строки. Кстати, если Вы не используете длинные имена файлов, имеет смысл пользоваться библиотекой, которая их не поддерживает.
И еще, вот здесь: dH=SD.open(“proba.txt”, FILE_WRITE); proba.txt - это ни что иное, как именно текстовая строка. Вы не забыли посчитать ее в общем балансе используемой памяти?

Это само по себе не менее 130 байтов.