SD карта и имена файлов.
- Войдите на сайт для отправки комментариев
Пт, 26/11/2021 - 10:19
Доброго времени.
Делаю простой логгер, для записи простых данных.
Столкнулся с ограничением длинны имени файла, больше 8 символов в стандартной библиотеке не получается.
Хотелось бы в имени файла хранить дату ДДММГГ и время ЧЧММСС создания файла.
Есть ли способ или библиотеки для работы с длинными именами файлов? Может атрибуты писать?
Обдумываю вариант со сквозной нумерацией файлов, но тогда нужно проводить проверку на наличие этого файла на карте и если он есть, то +1. Но в этом способе нет никакой наглядности о дате создания файла, пока не откроешь файл.
Что можете посоветовать?
ГММДДЧЧМ.МСС Если ограничить год до одного знака, то может и короткого имени хватит?
В принципе вариант... правда планировалось, что файлы будут .csv
Вообще планировал обозвать в формате Log_DD_MM_YY_hh-mm-ss.csv но оказалось очень жирно....
Я начитался про FAT и формат 8.3, но в FAT32 есть LNF. А вот как его задействовать, ума не приложу.
Плата какая ? Для операций с FAT32 надо овердохера памяти !
Классика... арудино нано + часы 1307 и КартРидер для микро CD, (Карта 4Гб, FAT32, кластер 4кб, полное форматирование)
Из библиотек часы 1307, СериалПорт и CD карта.
Переведи время в uint32_t а его в HEX и используй как имя файла, как раз 8 символов, рашшырение поставь какое угодно. Бонус - файлы будут отоматически сортироваться по имени->времени
Интересно, но немного не понял.
Время, имеется весь массив времени дата+ время? или только часть времени...
можете пояснить концепцию, как будет выглядеть имя файла?
Архивируемые данные рассчитаны на простого пользователя, который должен открыть проводник и сразу найти нужный файл за нужную дату.
Например видеорегистратор, фотоаппарат.
Подкаталоги на год, внутри на месяц ... наше все
Хороший вариант!
А встроенная библиотека разве может работать с каталогами?
Интересно, но немного не понял.
Хорошая библиотека RTC должна уметь отдавать время в формате time_t (описано в time.h, зачитай чонить за него). В этом типе содежится всё, дата+время. Так как тип time_t всего лишь псевдоним для uint32_t, то можно его преобразовать с помощью %08X в HEX строку, получится как раз 8 шестнадцатиричных цифр, которые можно использовать как имя файла.
Имя будет выглядеть примерно как "007E9FD1", добавляешь расширение, пишешь на диск. Дискретность, памойму, 1 секунда. То есть, времена, отличающиеся не менее чем на 1 секунду, будут иметь разные имена. Если их отсортировать по алфавиту, то наиболее поздний файл будет всегда последний
про time_t, это кол-во секунд прошедших со времени реперной даты
В этой реализации используется 32-битное целочисленное смещение без знака с полуночи 1 января 2000 года. Использование этой «эпохи» помогает упростить функции преобразования, в то время как 32-битное значение позволяет правильно представить время до вторника 7 февраля 06:28:15 2136 УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ. Макросы UNIX_OFFSET и NTP_OFFSET определены для помощи в преобразовании временных меток Unix и NTP и обратно.
Я вас понял.
Если обрабатывать файлы программой, то это то, что нужно.
Если человек, то он ничего не поймет.
В целом я понял проблему.. буду что-то решать.
Буду надеяться, что кто-то подскажет способ для LNF.
Mizar, посмотрите в сторону других библиотек работы с SD картой. Стандартная (SD) длинные имена не поддерживает. Посмотрите SdFat.
Спасибо. Похоже то что нужно.
Запустил примеры, и действительно имя файла больше 8 библиотека обрабатывает.
Но примеров уж больно много и они тяжелые. Мне пока не хватило ума как их обрезать до оптимального размера, но я учусь....
И еще кстати, библиотека очень прожорлива....
И еще кстати, библиотека очень прожорлива....
Вы же сами хотели поддержку длинных имен! А чудес не бывает.
Дак можно прям в unixtime имена шлепать, без хекса...
Спасибо за советы. В итоге из-за прожорливости SdFat и некоторых сложностей с переводом, пошел по пути наименьшего сопроивления.
Сквозная нумерация файлов с предварительной проверкой существующих имен.
Проект близок к завершению, если бы не одна досадная мелочь.
Контроллер получает с датчиков температуры собственно температуру float с плавающей запятой... только оказалось, что там плавает не запятая, а точка......
Полученное значение температуры преобразовывается в String и через UART передается другой контроллер, который собственно пишет полученные данные на карту в файл .csv
И вот при открытии файла Excel не понимает число как дробное... ему нужна запятая.
Подскажите, как число float преобразовать в текст заменив точку на запятую.
Десятичный разделитель запятая - это российский стандарт. А общий стандарт - именно точка. Т.е. проблема в данном случае в екселе
А так все просто - в строке ищется точка и заменяется на запятую. И делаться это может уже на компе
В Excel, при ручном преобразовании, можно самому задавать символ разделителя.
Подскажите, как число float преобразовать в текст заменив точку на запятую.
Если решать встроенными средствами ардуино, то можно из float создать String, а потом заменить в String точку на запятую и отправить String в UART
https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/.
https://www.arduino.cc/en/Tutorial/BuiltInExamples/StringReplace
NikShel Верно, но ключевое слово РУЧНОЙ.... ту должно быть все как намного проще. Открыл, выделил мышкой, график построен.
v258 и Upper Ваш вариант наиболее интересен. в VBA знаю, а в Ардуино с разбором строк еще не игрался.
Спасибо.
Правильно я понимаю???
String myString = "12.34";
myString.replace('.',',');
Я сразу в новой системе windows меняю а региональных настройках запятую на точку. Зато потом нет никаких проблем с запятыми в числах. Вообще как по мне запятая это бред. Как написать перечисление чисел в одной строке, если по правилам языка между ними надо ставить запятую? Конечно бывает пробел после запятой разделяющей числа, но если его пропустили?
Как написать перечисление чисел в одной строке, если по правилам языка между ними надо ставить запятую? Конечно бывает пробел после запятой разделяющей числа, но если его пропустили?
в csv предусмотрена вариант записи "12,34";"56,78"
12,34 в первый столбик, 56,78 во второй столбик.
Естественно, что мы не можем предусмотреть все возможные варианты, и так уж сложилось, что Балл Гейтс родился не в Воронеже, и ему неведомо, что мы используем в Русском языке...
У меня же задача, как можно сильнее упростить жизнь Пользователю изобретаемой приблуды, что бы он не заморачивался с конвертацией символов и переводов. Да и макросы писать под это дело тоже не охота...
Ардуина должна положить в файл данные в формате, который любой эксель откроет и раскидает данные по ячейкам. Единственное, что пользователь должен сделать, выделить мышкой диапазон ячеек и нажать на диаграмму. График готов.
Ну так Вам предложили два варианта:
1. Настроить в компьютере десятичный разделитель точку (кстати, так сделано не только у nik182, у меня, например, тоже).
2. Заменить точку в выводимой строке на запятую либо в Ардуино, либо в программе на ПК, которая будет вводить данные с Ардуино.
Чего ж Вам еще надо?
Я с вами просто поддержал беседу и пояснил некоторые моменты.
Вариант с заменой запятой - решение.
Ходить по всем кабинетам и перестраивать все возможны компьютеры, это не решение.
Ходить по всем кабинетам и перестраивать все возможны компьютеры, это не решение.
А что, во всех кабинетах используется одна и та же ОС с одинаковой локалью и одинаковым десятичным разделителем?
Если хотя бы на один из трех вопросов "нет", то все равно придется ходить.
Но лично я бы предпочел перекодировать на Ардуино, причем необходимость перекодировки обусловил джампером, - именно чтобы не нужно было подстраивать компы под Ардуино.
Я работаю на предприятии. Для проведения определенных испытаний создан сей проект. Работник, он же пользователь, которому поручено провести это испытание, проводит, вынимает карту и передает файлы скажем инженеру.... а тот их пересылает еще кому-то...... при этом архив могут открыть спустя неделю, месяц, год. Все компы не перенастроишь. А большинство пользователей используют стандартные настройки.
С джампером идея интересная. Как вариант можно два файла писать. Время покажет.
Всем спасибо за советы.
«Скормите» данные Visio. На сколько я помню - он толерантен к подобным данным (хотя не уверен на все 100%), к тому же визуализировать может куда интереснее экселя.
Ага, и стоит тыщщу денег в месяц за одно рабочее место. В экселе новом отличная визуализация
Очень много предложений, решений, разновидностей и вариантов... а вот попробуйте решить эту задачу когда:
На вашем предприятии есть N рабочих мест.
Вы не являетесь администратором, поэтому все настройки вам недоступны. Вы даже не можете сменить язык по умолчанию и время блокировки компьютера.
Сеть вам недоступна, только почта.
Флеш накопители и другие носители использовать запрещено. (см.выше, только почта).
У вас есть эксель.
У вас есть чужой ноутбук с интернетом. (используется для отправки архива)
Флеш накопители и другие носители использовать запрещено. (см.выше, только почта).
Я не предлагал раньше один вариант, из за соображений безопасности. Но если SD считывает специально обученный человек, то он может подойти. Называете файлы как я предлагал выше ГММДДМ.МСС или как предлагал DetSimen. При копировании с SD на ПК запускаете или cmd или bat или скрипт который переименовывает файлы в удобный для вас вид.
в экселе есть функция импорта csv, там можно указать любой разделитель