Arduino SD card не может писать (пишет плохие файлы, а потом я получаю ошибку)

Я разрабатываю очень простой проект для измерения некоторых температур и хранения их на SD-карте. У меня проблема с попытками писать. Независимо от того, что я делаю, SD-карта всегда заканчивается таким содержимым:

И в режиме только для чтения. Я отформатировал его в FAT16, FAT32, в Windows, Ubuntu и всегда один и тот же. Я переключился между двумя разными платами Arduino UNO, двумя разными SD-модулями, соединенными следующим образом:

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

Подробный пример того, что я делаю и что получаю

Я написал этот простой код для тестирования:

#include <SD.h>
#define CHIP_SELECT_PIN 10
/* CIRCUITO ----------------
* SD-карта, подключенная к шине SPI следующим образом:
* MOSI - pin 11
* MISO - pin 12
* CLK - pin 13
* CS - pin 10. */
File archivo;
char cadena[20];
char c;  
void setup(void) {
Serial.begin(9600);
while (!Serial) {;} // Esperar a que se inicialice la comunicacion serial
      while (Serial.read() >= 0) {;} // Limpiar el buffer
// INICIALIZAR LA MEMORIA ----------------------------------------
Serial.print("Initializing SD card... ");
pinMode(CHIP_SELECT_PIN, OUTPUT);
if (!SD.begin(CHIP_SELECT_PIN)) {
  Serial.println("Unable to initialize. Remove the card.");
  while (1);
}
Serial.println("OK!");
// ABRIR UN ARCHIVO PARA ESCRIBIR --------------------------------
if (SD.exists("ARCHIVO.TXT")) {
  Serial.println("Deleting existing file with the same name. ");
  SD.remove("ARCHIVO.TXT");
}
Serial.print("Creating new file... ");
if (!(archivo = SD.open("ARCHIVO.TXT", FILE_WRITE))) {
  Serial.println("Unable to create the file. Remove the card.");
  while (1);
}
Serial.println("File successfully created. ");
Serial.print("Send a string to store in the card... ");
while (Serial.available() == 0); // Nos quedamos esperando a que nos manden el numero
leerCadena('\n', cadena, 19);
Serial.print("The following string was received: \" ");
Serial.print(cadena);
Serial.println("\"");
archivo.print(cadena);
archivo.close();
Serial.println("The string was successfully stored in the card. ");
// Lectura de los datos guardados en la memoria ------------
Serial.print("Preparing to read data in card... ");
if (!(archivo = SD.open("ARCHIVO.TXT", FILE_READ))) {
  Serial.println("Cannot open file to read. Remove the card. ");
  while(1);
}
Serial.print("The string stored in memory is: \"");  
while ((c = archivo.read()) >= 0) {
  Serial.print(c);
}
Serial.println("\"");
archivo.close();
Serial.println("Remove the card.");
while(1);
}
void loop(void) {}
void leerCadena (char corte, char* cadena, byte n_bytes) {
  byte n_leidos;
  n_leidos = Serial.readBytesUntil(corte, cadena, n_bytes);
  cadena[n_leidos] = '\0';
  delay(100);
  while (Serial.read() >= 0) {;} 
}

и вот что я делаю и получаю:

  1. Сначала я форматирую свою SD-карту в FAT32 с помощью Gparted (то же самое происходит, если я форматирую ее в FAT16 или 32 как в Ubuntu, так и в Windows).
  2. Я проверяю SD-карту в своем компьютере. Он работает идеально. Я могу вынуть его и снова подключить, и данные будут там. Все В ПОРЯДКЕ.
  3. Я вставил карту в слот SD, подключенный к Arduino, и запустил вышеприведенную программу. То что я получаю через последовательный монитор это
  4. Теперь я вынимаю карту из Arduino и вставляю ее в свой компьютер. Вот его содержание: Файл "readme.txt" содержит тот же текст, что и раньше. Файл "ARCHIVO.TXT-пусто. Двоичные файлы различаются по размеру, например, второй-3 ГБ, а четвертый-774 МБ.
  5. Теперь я пытаюсь изменить содержимое в "readme.txt-и вот что я понимаю: я тоже не могу удалять файлы.
  6. Я вынимаю SD - карту из компьютера и снова вставляю ее в Ardino. Сбрасываю плату и через последовательный порт получаю:
  7. Теперь содержимое карты, увиденной в компьютере, отличается: и файл "ARCHIVO.TXT" нет.
  8. Если я снова вставлю карту в Arduino и сброшу плату, все повторится с шага № 3. Я имею в виду, что он создает файл "ARCHIVO.TXT" среди других странных файлов, в следующий раз, когда я помещаю его в Arduino, он удаляет файл "ARCHIVO.txt", и так далее.

Если после всего этого я отформатирую SD-карту в своем компьютере, мы вернемся к шагу номер 1.

Я собираюсь отказаться от Arduino и SD - модуля и перейти на Raspberry. Но это гораздо дороже для этой чрезвычайно простой задачи, которую мне нужно сделать...

, 👍0


6 ответов


Лучший ответ:

1

Проблема была решена волшебным образом. Я думаю, что причиной этой проблемы были кабели. Я использовал кабели длиной около 15 см, теперь изменил их на 5 см и отлично работает.

,

1

-Вы изменили контакт CS в коде на 10? -Может возникнуть проблема с SD-картой, попробуйте другую и расскажите нам. -После "dataFile.close();" поставьте: "if(dataFile)Serial.println("not closed");" и посмотрите окно последовательного монитора.

,

Спасибо за ваши ответы. Я перепробовал почти все. Я добавил к вопросу дополнительную информацию. Я жду новую SD - карту. После этого у меня закончились идеи о том, в чем может быть проблема..., @user171780


1

Вы должны гарантировать, что file.txt не открывается до выключения питания или извлечения SD-карты. Я рекомендую вам, во-первых, выполнить цикл "для", чтобы остановиться в итерациях "X". Если это сработает, вы можете затем нажать кнопку в своем проекте, чтобы остановить его в любое время.

,

1

У меня была та же проблема (использование UNO с модулем MH-SD, напрямую подключенным к arduino). Модуль, по-видимому, правильно инициализирован, и я мог бы перечислить файлы, которые уже были там, но когда я попытался создать один пустой файл, готовый для чтения, была создана целая куча случайных именованных файлов, многие из которых были огромными (по данным моего компьютера, хотя он сказал, что все они повреждены и не мог открыть ни один из них). А затем карта не была распознана, когда я попытался использовать ее снова, и ее пришлось переформатировать. В конце концов я обнаружил, что один из проводов, которые я использовал, в частности тот, который находился рядом с МИСО, был неисправен. Я подозреваю, что длина кабелей не имеет значения, я думаю, что у пользователя 171780 был неисправный кабель в том же положении.

,

1

Я изменяю напряжение с 5 В на 3,3 В и перемещаю GND на вывод GND рядом с 3,3 В. Теперь я могу писать и читать текстовый файл на SD-карте.

,

0

Я думаю, что, возможно, проблема исходит от SD-модуля, который вы используете. Я использовал SD-модуль точно так же, как и вы.И я не могу успешно записывать или считывать данные. Что еще серьезнее, моя карта сломана, и ущерб необратим.Это соединение-новый SD-модуль, который я использую, и я успешно использую. Вы можете высушить сами. https://www.qutaojiao.com/8515.html?fbclid=IwAR0T9dFoAOyJhTCSOHeDWQTE_Iuq8l5eGN9ByYth2uPmIyzC2bHLdt0_cKk

,

По сути, это ответ "только для ссылок" (и на сайт на иностранном языке). Вы должны предоставить (переведенные на английский язык) важные части ответа непосредственно здесь, а не ссылаться на них., @Majenko