SD карта и имена файлов.

Mizar
Offline
Зарегистрирован: 23.12.2018

Доброго времени.

Делаю простой логгер, для записи простых данных.

Столкнулся с ограничением длинны имени файла, больше 8 символов в стандартной библиотеке не получается.

Хотелось бы в имени файла хранить дату ДДММГГ и время ЧЧММСС создания файла.

Есть ли способ или библиотеки для работы с длинными именами файлов? Может атрибуты писать?

Обдумываю вариант со сквозной нумерацией файлов, но тогда нужно проводить проверку на наличие этого файла на карте и если он есть, то +1. Но в этом способе нет никакой наглядности о дате создания файла, пока не откроешь файл.

Что можете посоветовать?

Upper
Offline
Зарегистрирован: 23.06.2020

ГММДДЧЧМ.МСС Если ограничить год до одного знака, то может и короткого имени хватит? 

Mizar
Offline
Зарегистрирован: 23.12.2018

В принципе вариант... правда планировалось, что файлы будут .csv

Вообще планировал обозвать в формате Log_DD_MM_YY_hh-mm-ss.csv но оказалось очень жирно....

Я начитался про FAT и формат 8.3, но в FAT32 есть LNF. А вот как его задействовать, ума не приложу. 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Плата какая ? Для операций с FAT32 надо овердохера памяти !

Mizar
Offline
Зарегистрирован: 23.12.2018

Классика... арудино нано + часы 1307 и КартРидер для микро CD,  (Карта 4Гб, FAT32, кластер 4кб, полное форматирование)

Из библиотек часы 1307, СериалПорт и CD карта.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Переведи время в uint32_t а его в HEX и используй как имя файла, как раз 8 символов, рашшырение поставь какое угодно. Бонус - файлы будут отоматически сортироваться по имени->времени 

Mizar
Offline
Зарегистрирован: 23.12.2018

Интересно, но немного не понял. 

Время, имеется весь массив времени дата+ время? или только часть времени...

можете пояснить концепцию, как будет выглядеть имя файла?

Архивируемые данные рассчитаны на простого пользователя, который должен открыть проводник и сразу найти нужный файл за нужную дату.

Например видеорегистратор, фотоаппарат.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Подкаталоги на год, внутри на месяц ... наше все

Mizar
Offline
Зарегистрирован: 23.12.2018

Хороший вариант!

А встроенная библиотека разве может работать с каталогами?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Mizar пишет:

Интересно, но немного не понял.

Хорошая библиотека RTC должна уметь отдавать время в формате time_t (описано в time.h, зачитай чонить за него). В этом типе содежится всё, дата+время.  Так как тип time_t всего лишь псевдоним для uint32_t, то можно его преобразовать с помощью %08X в HEX строку, получится как раз 8 шестнадцатиричных цифр, которые можно использовать как имя файла. 

Имя будет выглядеть примерно как "007E9FD1", добавляешь расширение, пишешь на диск. Дискретность, памойму, 1 секунда.  То есть, времена, отличающиеся не менее чем на 1 секунду, будут иметь разные имена. Если их отсортировать по алфавиту, то наиболее поздний файл будет всегда последний 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

про time_t, это кол-во секунд прошедших со времени реперной даты

 В этой реализации используется 32-битное целочисленное смещение без знака с полуночи 1 января 2000 года. Использование этой «эпохи» помогает упростить функции преобразования, в то время как 32-битное значение позволяет правильно представить время до вторника 7 февраля 06:28:15 2136 УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ. Макросы UNIX_OFFSET и NTP_OFFSET определены для помощи в преобразовании временных меток Unix и NTP и обратно.

Mizar
Offline
Зарегистрирован: 23.12.2018

Я вас понял. 

Если обрабатывать файлы программой, то это то, что нужно.

Если человек, то он ничего не поймет.

В целом я понял проблему.. буду что-то решать.

Буду надеяться, что кто-то подскажет способ для LNF.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Mizar, посмотрите в сторону других библиотек работы с SD картой. Стандартная (SD) длинные имена не поддерживает. Посмотрите SdFat.

Mizar
Offline
Зарегистрирован: 23.12.2018

Спасибо. Похоже то что нужно.

Запустил примеры, и действительно имя файла больше 8 библиотека обрабатывает.

Но примеров уж больно много и они тяжелые. Мне пока не хватило ума как их обрезать до оптимального размера, но я учусь....

И еще кстати, библиотека очень прожорлива....

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Mizar пишет:

И еще кстати, библиотека очень прожорлива....

Вы же сами хотели поддержку длинных имен! А чудес не бывает.

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак можно прям в unixtime имена шлепать, без хекса...

Mizar
Offline
Зарегистрирован: 23.12.2018

Спасибо за советы. В итоге из-за прожорливости SdFat и некоторых сложностей с переводом, пошел по пути наименьшего сопроивления.

Сквозная нумерация файлов с предварительной проверкой существующих имен.

Проект близок к завершению, если бы не одна досадная мелочь.

Контроллер получает с датчиков температуры собственно температуру float с плавающей запятой... только оказалось, что там плавает не запятая, а точка......

Полученное значение температуры преобразовывается в String и через UART передается другой контроллер, который собственно пишет полученные данные на карту в файл .csv

И вот при открытии файла Excel не понимает число как дробное... ему нужна запятая.

Подскажите, как число float преобразовать в текст заменив точку на запятую.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Десятичный разделитель запятая - это российский стандарт. А общий стандарт - именно точка. Т.е. проблема в данном случае в екселе

А так все просто - в строке ищется точка и заменяется на запятую. И делаться это может уже на компе

NikShel
Offline
Зарегистрирован: 21.01.2018

В Excel, при ручном преобразовании, можно самому задавать символ разделителя.  

Upper
Offline
Зарегистрирован: 23.06.2020

Mizar пишет:

Подскажите, как число 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

Mizar
Offline
Зарегистрирован: 23.12.2018

NikShel Верно, но ключевое слово РУЧНОЙ.... ту должно быть все как намного проще. Открыл, выделил мышкой, график построен.

v258 и  Upper Ваш вариант наиболее интересен. в VBA знаю, а в Ардуино с разбором строк еще не игрался.

Спасибо.

Правильно я понимаю???

String myString = "12.34";

myString.replace('.',',');

nik182
Offline
Зарегистрирован: 04.05.2015

Я сразу в новой системе windows меняю а региональных настройках запятую на точку. Зато потом нет никаких проблем с запятыми в числах. Вообще как по мне запятая это бред. Как написать перечисление чисел в одной строке, если по правилам языка между ними надо ставить запятую? Конечно бывает пробел после запятой разделяющей числа, но если его пропустили?

Mizar
Offline
Зарегистрирован: 23.12.2018

nik182 пишет:

Как написать перечисление чисел в одной строке, если по правилам языка между ними надо ставить запятую? Конечно бывает пробел после запятой разделяющей числа, но если его пропустили?

в csv предусмотрена вариант записи "12,34";"56,78"

12,34 в первый столбик, 56,78 во второй столбик.

Естественно, что мы не можем предусмотреть все возможные варианты, и так уж сложилось, что Балл Гейтс родился не в Воронеже, и ему неведомо, что мы используем в Русском языке...

У меня же задача, как можно сильнее упростить жизнь Пользователю изобретаемой приблуды, что бы он не заморачивался с конвертацией символов  и переводов. Да и макросы писать под это дело тоже не охота...

Ардуина должна положить в файл данные в формате, который любой эксель откроет и раскидает данные по ячейкам. Единственное, что пользователь должен сделать, выделить мышкой диапазон ячеек и нажать на диаграмму. График готов.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну так Вам предложили два варианта:

1. Настроить в компьютере десятичный разделитель точку (кстати, так сделано не только у nik182, у меня, например, тоже).

2. Заменить точку в выводимой строке на запятую либо в Ардуино, либо в программе на ПК, которая будет вводить данные с Ардуино.

Чего ж Вам еще надо?

Mizar
Offline
Зарегистрирован: 23.12.2018

Я с вами просто поддержал беседу и пояснил некоторые моменты.

Вариант с заменой запятой - решение.

Ходить по всем кабинетам и перестраивать все возможны компьютеры, это не решение.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Mizar пишет:

Ходить по всем кабинетам и перестраивать все возможны компьютеры, это не решение.

А что, во всех кабинетах используется одна и та же ОС с одинаковой локалью и одинаковым десятичным разделителем?

Если хотя бы на один из трех вопросов "нет", то все равно придется ходить.

 

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

Mizar
Offline
Зарегистрирован: 23.12.2018

Я работаю на предприятии. Для проведения определенных испытаний создан сей проект.  Работник, он же пользователь, которому поручено провести это испытание, проводит, вынимает карту и передает файлы скажем инженеру.... а тот их пересылает еще кому-то...... при этом архив могут открыть спустя неделю, месяц, год. Все компы не перенастроишь. А большинство пользователей используют стандартные настройки.

С джампером идея интересная. Как вариант можно два файла писать. Время покажет.

Всем спасибо за советы.

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

«Скормите» данные Visio. На сколько я помню - он толерантен к подобным данным (хотя не уверен на все 100%), к тому же визуализировать может куда интереснее экселя.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Ага, и стоит тыщщу денег в месяц за одно рабочее место. В экселе новом отличная визуализация

Mizar
Offline
Зарегистрирован: 23.12.2018

Очень много предложений, решений, разновидностей и вариантов... а вот попробуйте решить эту задачу когда:

На вашем предприятии есть N рабочих мест.

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

Сеть вам недоступна, только почта.

Флеш накопители и другие носители использовать запрещено. (см.выше, только почта).

У вас есть эксель.

У вас есть чужой ноутбук с интернетом. (используется для отправки архива)

Upper
Offline
Зарегистрирован: 23.06.2020

Mizar пишет:

Флеш накопители и другие носители использовать запрещено. (см.выше, только почта).

Я не предлагал раньше один вариант, из за соображений безопасности. Но если SD считывает специально обученный человек, то он может подойти. Называете файлы как я предлагал выше ГММДДМ.МСС или как предлагал DetSimen. При копировании с SD на ПК запускаете или cmd или bat или скрипт который переименовывает файлы в удобный для вас вид.

rkit
Offline
Зарегистрирован: 23.11.2016

в экселе есть функция импорта csv, там можно указать любой разделитель