Функция записи SD нужна помощь
- Войдите на сайт для отправки комментариев
Пт, 31/01/2014 - 22:03
Подскажите в чём моя ошибка? Пишу такую функцию записи на карту SD данных. В первом параметре String file_name передаю с каким файлом нужно работать функции. В результате выдаёт ошибку:
*.ino: In function 'int sd_write(String, String, String, float)':
*:1026: error: no matching function for call to 'SDClass::open(String&, int)'
C:\Program Files (x86)\Arduino\libraries\SD\src/SD.h:74: note: candidates are: File SDClass::open(const char*, uint8_t)
int sd_write (String file_name, String now_date, String now_time, float value) { myFile = SD.open(file_name , FILE_WRITE); // if the file opened okay, write to it: if (myFile) { Serial.print("Writing to test.txt..."); myFile.println("testing 1, 2, 3."); // close the file: myFile.close(); Serial.println("done."); } else { // if the file didn't open, print an error: Serial.println("error opening test.txt"); } }
Где мой косяк? непонимаю на что ругается...
SDClass::open(const char*, uint8_t) принимает в качестве аргумента указатель на string, а вы пытаетесь скормить ей объект String.
Спасибо!
Это gcc-расширение стандарта?
Нет, это объявление статического массива. Можно просто объявить указатель.
Нет, это объявление статического массива. Можно просто объявить указатель.
Размерность массива динамическая тут. И он не статический, а выделяется на стеке. Это C99 стандарт такое разрешил, раньше это было доступно только как gcc-расширение. Я на С++ перешёл раньше, так что новшества C99 упустил. Сорри за шум, просто глаз зацепился.
Посмотрел внимательно на класс String и не понял, почему у него нет метода c_str(), который решил бы вопрос топикстартера. Посмотрев ещё более внимательно, считаю этот класс мог бы быть пооптимальнее.
SDClass::open(const char*, uint8_t) принимает в качестве аргумента указатель на string, а вы пытаетесь скормить ей объект String.
Кстати, я немного опоздал с предложением добавить c_str в класс String: https://github.com/jabbervorx/Arduino/commit/19e4d387258eb4dcd323fe10c9cceb0671ef8e03
SDClass::open(const char*, uint8_t) принимает в качестве аргумента указатель на string, а вы пытаетесь скормить ей объект String.
Почему-то при создании съедает последний символ в имени файла. Cохраняет в виде *.tx а не *.txt
попробуйте так
неа, непрокатывает.
смотрю что выводит в serial:
На выходе:
Походу пустое имя файла получается и по этому error.
попробуйте так
Так нельзя делать. Куда указывает f_n? Указатель не инициализирован, это прямой путь перезаписать поверх важных данных или вообще никуда не записать, если указывает на несуществующую область памяти.
Секрет в том, что второй аргумент toCharArray -- размер буфера, который был сначала правильно указан как file_name.length()+1.
Спасибо ещё раз!. Теперь полное имя файла)))
всёравно недогоняю чего Вы написали:
Первая строчка создаём массив символов. размерность массива задаётся из длинны file_name.
а это что?
и это тоже непонятно... =) Если Вам несложно объясните нубу?)
Спасибо ещё раз!. Теперь полное имя файла)))
всёравно недогоняю чего Вы написали:
Первая строчка создаём массив символов. размерность массива задаётся из длинны file_name.
а это что?
и это тоже непонятно... =) Если Вам несложно объясните нубу?)
Первая строка выделяет массив символов на стеке функции. Размерность массива равна длине имени файла плюс один символ для признака конца строки '\0' (подробнее можно прочитать про ascii-z строки в гугле).
Вторая строка копирует содержимое внутреннего буфера строки из класса String в выделенный массив.
Поскольку для признака конца строки тоже требуется место, то размер буфера должен быть на один символ больше, чем длина строки.
В новой версии библиотеки есть функция c_str(), с помощью которой можно было бы написать код проще:
Но эта библиотека пока что в статусе беты.
А сколько максимум символов может иметь имя файла? столкнулся с тем, что имя файла вместе с расширением имеет 14 символов, никак не хотелось создаваться и сохраняться на сдишку. Уменьшил имя файла до 11 символов - создаётся и записывается...
12345678.123
А сколько максимум символов может иметь имя файла? столкнулся с тем, что имя файла вместе с расширением имеет 14 символов, никак не хотелось создаваться и сохраняться на сдишку. Уменьшил имя файла до 11 символов - создаётся и записывается...
Если внимательно прочтитать описание библиотеки, то там написано, что они ограничились поддержкой коротких имён только. Формат короткого имени для FAT 8+3, как написал Максим.
Народ, стоит задача сделать так чтобы при каждом включении на флешке создавался новый файл и туда сливались все данные.
Решил просто:
Но потом когда я захотел задать имя создаваймого файла на флешке fileNumberEEP
ругаецо:
И ещё, под шумок помогите создавать файлы не 0...255 а 0.csv...255.csv
Вот весь код:
Прошу прощения за гавнокод, но я по другому не умею.
Arduino\hardware\tools\avr\doc\avr-libc\avr-libc-user-manual.pdf или здесь(онлайн версия) http://nongnu.org/avr-libc/user-manual/group__avr__stdio.html
Я там нашол много полезных функций.
Ниасилю, знаю точно.
Сишник вам не пехепе!
Как попало писать - работать не будет.
А где %d это значит что туда мы будем пихать даные которые идут после комы?
Спасибо, работает.
Вот только не совсем разобрался с двумя другими принт эфами
Как можно есть меньше памяти?
А второй, если хранится во флеш памяти то это типо как EEPROM?
да там будет число которое в переменной, которая 3 параметром.
http://www.cplusplus.com/reference/cstdio/sprintf/
настоятельно рекомендую читать документацию чтобы не было глупых вопросов.
sprintf_P константа формата в PROGMEM