如何在arduino中提高SD卡写入速度


12

我正在创建一个数据记录器系统,该系统以每秒约20000-30000字节的高速记录数据到SD卡中。但是arduino中的SD库当前以每秒4500-5000字节的速度写入数据,这太慢了。

我已经阅读了此技巧以提高写入速度,但是我想知道是否可以通过调整SPISettings来采用更直接的方法。


1
您可以尝试SdFat库-它比默认的SD库效率更高。
马延科

您可能还想确保SD卡质量良好,尽管5000字节对于任何种类的SD卡来说似乎都太低了。
莱恩

Answers:


11

好。因此,我尝试了SDFat库。该库绝对比adruino随附的默认SD库更好。但这不是我解决低数据速率问题的方法。

我从这篇文章中遵循了SDFat库作者的指示。

根据fat16lib,要提高数据速率,我们需要明智地使用flush()。我们希望在每个周期中写入()数据,但是我们仅需要每100个周期刷新一次(大约)一次,具体取决于每个周期中写入的数据量。另外,请确保将标志保留在SD.open()中为'O_WRITE | O_CREAT”而不是“ FILE_WRITE”。

这无疑使速度大大提高。但是我还需要更多!

以二进制形式存储数据(参阅此博客)甚至进一步提高了性能。

使用4类SD卡,我当前的速度约为100-120 KBps(千字节)!

最后,我要感谢你们的帮助。


4

许多因素将决定您是否可以达到所需的速度。其中只有一些。


1.您的软件

SdFat库比Arduino的IDE标准SD图书馆更快。它还具有与标准SD库一起使用的易于使用的兼容性功能。试试看。

2.您的硬件

您应该使用高级SD卡。如您所知,SD卡按性能分类。互联网上的大多数人都建议使用SanDisk SD卡。


我将在几天后尝试,并让您知道结果。谢谢。
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 kB)缓冲区。但是我还观察到,使用File.write写入单个字节非常慢,并且编译器似乎无法对其进行优化(毕竟,它只是将一个字节复制到内部缓冲区中,并检查缓冲区是否已满,并且SPI传输应该开始)。使用我自己的外部缓冲区和File.write(buffer,size)在我的应用程序中也极大地提高了性能。
奥利弗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.