Мусор хранится на 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 — это начало строки, после чего необходимо сохранить много другой информации о параметрах, что оказывается быть мусором.
@shwetank vishnu, 👍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
- Как сбросить или отформатировать Arduino?
- Проблема с настройкой i2c OLED wemos D1 mini shiled (64*24)
- Структура хранилища SD-карты: принудительно с прямым порядком байтов/обратным порядком байтов?
- Существует ли оборудование, которое можно использовать для загрузки исходного кода скетчей через USB-флэш-диск (автоматически, подключив его)
- Проблема Arduino "Отслеживание максимальной мощности" (MPPT)
- Как подключить акселерометр, GPS, микрофон и GSM-модуль к Arduino?
- Можно ли использовать GSM и Data Logger Shield одновременно на одном Arduino?
- Могу ли я использовать Arduino для своих целей?
Имена файлов тоже мусор или только содержимое файлов? Мусор только на определенных сд картах определенной марки или типа? Как выглядит мусор?, @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