Имя файла формируется динамически из байтов ТМ ключа:
String tmkey;
tmkey += String(addr[i], HEX);
как записать на SD карту файл с этим именем?
File myFile = SD.open(tmkey.c_str(), FILE_WRITE);
не работает. Преобразование в char не работает
Имя файла формируется динамически из байтов ТМ ключа:
String tmkey;
tmkey += String(addr[i], HEX);
как записать на SD карту файл с этим именем?
File myFile = SD.open(tmkey.c_str(), FILE_WRITE);
не работает. Преобразование в char не работает
const char* filename = tmkey.c_str();
File myFile = SD.open(filename, FILE_WRITE);
такой макар тоже не работает, идеи кончились
при этом если сделать
File myFile = SD.open("test", FILE_WRITE);
все создается
Видимо, в строке есть символы, запрещенные в названии файла
[quote="ArcticFox, post:2, topic:19514"]
`const char* filename = tmkey.c_str();`
[/quote]
А компилятор не ругается, что вы константе значение пытаетесь присвоить?
#include <SPI.h>
#include <SD.h>
File myFile;
String tmkey = String(0xFA45AA, HEX);
void setup() {
Serial.begin(9600);
// Инициализация модуля (пин 10 — стандартный CS-пин для большинства плат)
if (!SD.begin(10)) {
Serial.println("Ошибка инициализации SD-карты!");
return;
}
// Открытие файла для записи
myFile = SD.open(tmkey, FILE_WRITE);
if (myFile) {
myFile.println("Новая строка данных");
myFile.close(); // Обязательно закрываем файл для сохранения данных
Serial.println("Запись завершена.");
} else {
Serial.println("Ошибка открытия файла.");
}
}
void loop() {}
Скетч использует 12020 байт (39%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1030 байт (50%) динамической памяти, оставляя 1018 байт для локальных переменных. Максимум: 2048 байт.
Ошибка где-то в другом месте. Код покажите полностью.
Зачем .c_str()? Метод вполне понимает и String.
А в остальном … мы поняли, что код, которого никто не видел, почему-то, работает не так, как Вам бы хотелось. Держите нас в курсе развития ситуации.
такого не может быть. Нули отсекаются, конечно имя файла выглядит так - 4f73a2cc271.txt
увидел в примерах, где у человека похожая проблема была, попытался использовать
тем не менее, файл не создается с использованием переменной string в качестве названия файла
Может из-за этого:
The SD library allows for reading from and writing to SD cards, e.g. on the Arduino Ethernet Shield. It is built on sdfatlib by William Greiman. The library supports FAT16 and FAT32 file systems on standard SD cards and SDHC cards. It uses short 8.3 names for files.
не совсем понял вас? имя файла должно быть короче?
Максимум 8 символов. Хотя, насколько я помню, это не должно мешать созданию файла, лишние символы просто отсекаются.
Я повторяю - начните с того, чтобы показать код полностью. Судя по вашим замечаниям в теме, опыт программирования у вас небольшой, мало ли каких ошибок вы насажали в скетче.
Реально, это задачка для первого класса , а мы уже полдня с вами возимся.
Не, знаю, кода мы как не видели, так и не видим, а кофейная гуща на этом форуме запрещена, так что гадать о причинах мы не будем.
Продолжайте держать нас в курсе.
String tmkey = "";
for (int i = 0; i < addr_length; i++) {
// Форсируем два шестнадцатеричных символа на байт
if (addr[i] < 0x10) { tmkey += "0"; }
tmkey += String(addr[i], HEX); }
// Ограничиваем длину имени (8 символов для FAT16/FAT32)
if (tmkey.length() > 8) { tmkey = tmkey.substring(0, 8); }
// Добавляем расширение .dat (или любое 3-символьное)
tmkey += ".dat";
“Хренушки, сказали заиньки”. Вот строчки из метода open
if (!make83Name(fileName, dname)) {
return false;
}
А вот
uint8_t SdFile::make83Name(const char* str, uint8_t* name) {
uint8_t c;
uint8_t n = 7; // max index for part before dot
uint8_t i = 0;
// blank fill name and extension
while (i < 11) {
name[i++] = ' ';
}
i = 0;
while ((c = *str++) != '\0') {
if (c == '.') {
if (n == 10) {
return false; // only one dot allowed
}
n = 10; // max index for full 8.3 name
i = 8; // place for extension
} else {
// illegal FAT characters
uint8_t b;
#if defined(__AVR__)
PGM_P p = PSTR("|<>^+=?/[];,*\"\\");
while ((b = pgm_read_byte(p++))) if (b == c) {
return false;
}
#elif defined(__arm__)
const uint8_t valid[] = "|<>^+=?/[];,*\"\\";
const uint8_t *p = valid;
while ((b = *p++)) if (b == c) {
return false;
}
#endif
// check size and only allow ASCII printable characters
if (i > n || c < 0X21 || c > 0X7E) {
return false;
}
// only upper case allowed in 8.3 names - convert lower to upper
name[i++] = c < 'a' || c > 'z' ? c : c + ('A' - 'a');
}
}
// must have a file name, extension is optional
return name[0] != ' ';
}
Как видите, “проблемы индейцев шерифа не волнуют”.
Судя по молчанию, клиент уменьшил длину имени файла и у него сразу и String и .c_str() заработали. Поэтому он тихо свалил, как большинство подобных…ни “спасиба”, ни “да-свиданья”
для библиотеки SD от ESP32 это не имеет никакого значения, 255 символов
нет, пока еще не уменьшил. Это необходимо? Судя по коду библиотеки, максимальный объем символов перед расширением - 7. Кто вообще это придумал?
нормальный у меня опыт программирования, но на других платформах правда, без строгой типизации, она меня всегда убивает