Як збільшити швидкість запису на SD-карту в ардуїно


12

Я створюю систему реєстратора даних, яка записує дані на SD-карту з високою швидкістю близько 20000-30000 байт в секунду. Але бібліотека SD в ардуїно в даний час записує дані зі швидкістю близько 4500-5000 байт в секунду, що занадто повільно.

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


1
Ви можете спробувати бібліотеку SdFat - це набагато ефективніше, ніж бібліотека SD за замовчуванням.
Majenko

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

Відповіді:


11

ГАРАЗД. Отже, я спробував lif SDFat. Ця бібліотека, безумовно, краща, ніж бібліотека SD за замовчуванням, яка постачається з adruino. Але я не так вирішив свою проблему із низькою швидкістю передачі даних.

Я дотримувався вказівки автора бібліотеки SDFat з цієї посади .

На думку fat16lib , щоб збільшити швидкість передачі даних, нам потрібно розумно використовувати флеш (). Ми хотіли б записати () дані в кожному циклі, але нам потрібно промивати () лише раз на 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.write (buf, size);

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

Замість цього:

//for each loop, it is going to make a handshake
while(<yourCondition>){
    SD.write(<yourValue>);
}

Зробіть:

char buf[length];
while(yourCondition){
    buf[index] = yourValue;
}
SD.write(buf,index);//only one handshake

У моєму проекті перший я отримав 4100 байт, а другий, використовуючи буфер із 128 (buf [128]), отримав 145408 байт у своєму проекті. Досить добре.


1
Я не знаю, що ви маєте на увазі під рукостисканням, оскільки AFAIK SD так чи інакше використовує буфер (512 кБ). Але я також зауважив, що писати окремі байти з File.write надзвичайно повільно, і компілятор, здається, не в змозі оптимізувати це (зрештою, це просто копіювання одного байта у внутрішній буфер і перевірка, чи буфер повний, і передача SPI повинна початок). Використання мого власного буфера зовні та File.write (буфер, розмір) принесло надзвичайне підвищення продуктивності і в моєму додатку.
Олівер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.