Как увеличить скорость записи на SD-карту в Ардуино

Я создаю систему регистрации данных, которая записывает данные на SD-карту с высокой скоростью около 20000-30000 байт в секунду. Но библиотека SD в arduino в настоящее время записывает данные со скоростью около 4500-5000 байт в секунду, что слишком медленно.

Я прочитал этот хак, чтобы улучшить скорость записи, но мне интересно, возможен ли более прямой подход, возможно, путем настройки настроек. Как увеличить скорость записи на SD Card?

, 👍13

Обсуждение

Вы можете попробовать [SdFat](https://github.com/greiman/SdFat ) библиотека - она намного эффективнее, чем SD-библиотека по умолчанию., @Majenko

Возможно, вы также захотите убедиться, что ваша SD-карта хорошего качества, хотя 5000 байт кажутся слишком малыми для любого типа SD-карты., @Len


3 ответа


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

13

ОК. Итак, я попробовал использовать SdFat lib. Эта библиотека определенно лучше, чем стандартная SD-библиотека, поставляемая с adruino. Но это не так, как я решил свою проблему с низкой скоростью передачи данных.

Я следовал инструкциям автора библиотеки SdFat из этого поста.

Согласно fat16lib, чтобы увеличить скорость передачи данных, нам нужно разумно использовать flush() . Мы хотели бы записывать () данные в каждом цикле, но нам нужно только очищать () один раз каждые 100 циклов или около того, в зависимости от того, сколько данных записывается в каждом цикле. Кроме того, не забудьте сохранить флаг в SD.open() как 'O_WRITE | O_CREAT' вместо 'FILE_WRITE'.

Это, несомненно, значительно увеличило скорость. Но мне нужно было больше!

Хранение данных в двоичном формате (ознакомьтесь с этим блогом) еще больше повысило производительность.

Моя текущая скорость составляет примерно 100-120 Кбит / с (это килобайты) с SD-картой класса 4!

Наконец, я хочу поблагодарить вас, ребята, за вашу помощь.

,

4

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


1. Ваше программное обеспечение

Библиотека SdFat работает быстрее, чем стандартная SD-библиотека Arduino IDE. Он также имеет простую в использовании функцию совместимости со стандартной библиотекой SD. Попробуйте это сделать.

2. Ваше оборудование

Вы должны использовать SD-карту высокого класса. Как вы, возможно, знаете, SD-карты сортируются по классам производительности. Большинство людей в интернете рекомендуют SD-карту SanDisk.

,

Я попробую это сделать через несколько дней и сообщу вам о результатах. Спасибо., @Ashish Ranjan


4

Избегайте попадания рукопожатия в буфер!

Использование SD.запись (buf,размер);

Привет всем, я работаю в проекте с той же проблемой. Я следовал тем же вашим шагам и получил точно такие же цифры. Я только что все уладил. Проблема заключается в рукопожатии, когда вы вызываете SD.write().

Вместо этого:

//для каждого цикла он будет выполнять рукопожатие
while(<yourCondition>){
    SD.write(<yourValue>);
}

Сделайте:

char buf[length];
while(yourCondition){
    buf[index] = yourValue;
}
SD.write(buf,index);//только одно рукопожатие

В моем проекте в первом я получил 4100 байт, а во втором использовал буфер с 128 (buf[128]). В моем проекте у меня 145408 байт. Достаточно хорошо.

,

Я не знаю, что вы подразумеваете под рукопожатием, потому что AFAIK SD в любом случае использует внутренний буфер (512 КБ). Но я также заметил, что запись отдельных байтов с помощью File.write выполняется чрезвычайно медленно, и компилятор, похоже, не может его оптимизировать (в конце концов, он просто копирует один байт во внутренний буфер и проверяет, заполнен ли буфер и должна ли начаться передача SPI). Использование моего собственного внешнего буфера и File.write(buffer,size) привело к значительному повышению производительности и в моем приложении., @oliver