Мусор хранится на SD-карте

Я выпускник электроники и инженер-проектировщик встраиваемых систем, работаю в этой области около двух лет, не считая хобби во время окончания учебы. В настоящее время я работаю над системой, в которой в качестве основного контроллера используется Atmega2560 с загрузчиком Arduino. Мы используем карту памяти емкостью 8 ГБ для сохранения данных журнала из нашей системы и отправки их на наш сервер через регулярные промежутки времени. Система работала нормально, однако у некоторых из них возникли проблемы с записью данных, некоторые мусорные значения сохраняются на SD-карте. Я прикрепил схему и фрагмент кода. Пожалуйста, дайте мне знать, если есть какие-либо проблемы с системой и как я могу их решить, пожалуйста, дайте мне знать, если что-то еще необходимо для правильного понимания проблемы.

Заранее спасибо.

     SD_Initialize();
  if(!SD.exists(SDTransactionDirectory)) 
  {
    if(SD.mkdir(SDTransactionDirectory)) 
    {

    }
  }
  RTC_Date_Time();
  String FileName = SDTransactionDirectory + "/" + RTCSDDate + RTCSDTime + ".txt";
  SD_File = SD.open(FileName, FILE_WRITE);
  if(SD_File)
  {
    delay(100);
    digitalWrite(LED_SD, HIGH);
    SD_File.println(GSMData);
    SD_File.close();
  }

SD_Initialize() — это пользовательская функция:-

void SD_Initialize()          //initialise SD card
{
  digitalWrite(SD_EN, HIGH);
  digitalWrite(SD_CS, LOW);

  delay(500);

  if(SD.begin(SD_CS))
  {
    digitalWrite(LED_SD, HIGH);
  }
  else
  {
    digitalWrite(LED_SD, LOW);
  }
}

Данные, хранящиеся в имени файла, следующие: - CLEnT|T|M008|\00Ÿûmï°]ŸëÜ£·zoòTÏæ{Œü[ŸýUô~ÛcCWY®ÞgÙë×<wBÄgnìÇFÿÉ=XoÎ.êžÄf·®ö¯³ç~åeÝ]1_Ï Эй? "zBõ¬ñ

Как вы можете видеть, начальные значения до «M008» в порядке, но после этого это мусор, а CLEnt|T|M008 — это начало строки, после чего необходимо сохранить много другой информации о параметрах, что оказывается быть мусором.

, 👍1

Обсуждение

Имена файлов тоже мусор или только содержимое файлов? Мусор только на определенных сд картах определенной марки или типа? Как выглядит мусор?, @Jot

Является ли GSMData строкой? Вам следует избегать String и всех операций конкатенации на основе String. Даже на Mega2560 с этим небольшим количеством SRAM все еще «сомнительно»., @Majenko

Все файлы записываются? Содержат ли RTCSDDate и RTCSDTime недопустимые символы имени файла?, @Code Gorilla

@Jot Имена файлов сохранены правильно, однако записанные данные являются мусором. Я внес изменения, чтобы вы знали о данных, хранящихся на карте. Это не зависит от марки и типа, поскольку мы используем SD-карту для всех систем., @shwetank vishnu

@Маженко да, это строковая переменная, не могли бы вы предложить какой-либо другой способ хранения данных на этой конкретной карте, данные составляют около 200 символов., @shwetank vishnu

@CodeGorilla да, файлы создаются с правильными именами, однако только данные не соответствуют желаемому формату., @shwetank vishnu

Вы сказали: «Это не зависит от марки и типа, поскольку мы используем SD-карту для всех систем». Вы хотели сказать, что используете «разные SD-карты для каждой системы»? Также проверьте текущие возможности и надежность вашего источника питания. Учитывайте возможность колебаний напряжения, вызывающих повреждение процессора, связи между процессором и SDCard, а также в самой SDCard., @st2000

@st2000 мы используем одну и ту же марку и тип SD-карт во всех системах, мы используем регулируемый источник питания на основе MPTT, который дополнительно преобразуется в 5 В для правильной работы. Он имеет достаточную номинальную мощность для выходного тока до 2А., @shwetank vishnu

Данные примера начинаются с CLEnT|T|M008|\0; является ли \0 фактической последовательностью двух символов "\" и "0"? Возможно, это совпадение, но выглядит подозрительно видеть экранированный нулевой символ непосредственно перед «поврежденными» данными. Заставляет задуматься о проблемах завершения строки., @jose can u c

Можете ли вы точно подтвердить, что **нужно** сохранить? Должно ли M008| быть последним сохраненным значением? Другими словами, что вы ожидаете увидеть?, @jose can u c

@shwetankvishnu https://majko.co.uk/blog/evils-arduino-strings, @Majenko

Вероятно, SD-карты разных OEM-производителей не похожи друг на друга. Кроме того, на рынке имеются поддельные SD-карты. Было бы более идеально, если бы вы использовали разные SD-карты и выявили любую корреляцию между SDC-картами и наблюдали неожиданное поведение., @st2000


1 ответ


1

Комментариев много, но ответа пока нет. В этом ответе есть лишь несколько основных правил.

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

Arduino mega 2560 лучше всего работает при напряжении 5,0 В или немного меньше. Ненадежно при 4В. При питании от источника питания 5 В лучшим вариантом для питания платы Arduino является разъем USB. Не рекомендуется подавать питание на плату Arduino через контакт 5 В. Если к контакту 5 В подключен мощный источник питания, регулятор напряжения может перегореть.

Если что-то не работает, вернитесь к чему-то надежному. Например модуль SD с HC4050 для смещения уровней напряжения. Резисторы ослабляют сигнал.

Сделайте небольшой тестовый скетч без использования объекта String. Чем более опытен человек в работе с Arduino, тем больше он советует избегать объекта String в микроконтроллерах avr.

Существуют поддельные SD-карты. Когда-нибудь один из них может оказаться у вас в руках. Кроме того, не каждая SD-карта совместима с библиотекой SD Arduino.

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

Если данные на дисплее или SD-карте неверны, отправьте их также на последовательный монитор. Вы должны знать, что на самом деле записано на SD-карте.

,

привет @jot, спасибо за завершение комментариев и указание на возможные проблемы, 1. Источник питания хорошо регулируется и фильтруется с помощью понижающего преобразователя постоянного тока, который получает входной сигнал от импульсного источника питания 18–36 В с номинальным током до 5 А. И я использую чип Atmega2560 с загрузчиком Arduino, а не саму плату Arduino. 2. Я с нетерпением жду внесения изменений в аппаратное обеспечение, чтобы использовать HC4050 для проверки ответа. 3. Проверил образец эскиза: все работает нормально, как и большинство систем. Обратите внимание, что эта проблема возникает с некоторыми системами, а не со всеми. 4. Все карты отформатировал в FAT b4 с помощью, @shwetank vishnu

Я попросил отправить систему с места, и как только я ее получу, я проверю последовательный монитор, чтобы узнать, что происходит., @shwetank vishnu