Arduino 阿杜伊诺+;Ethernet SD shield,列出SD卡上现有的所有文件名

Arduino 阿杜伊诺+;Ethernet SD shield,列出SD卡上现有的所有文件名,arduino,listings,Arduino,Listings,我有: Arduino MEGA 2560; 以太网+SD屏蔽; SD卡2GB FAT SD包含400个名为00000000的文件;0000001; 0000002; ... 00000098; 0000099; 0000100; ... 00000398; 00000399 我需要构造字符串var,它将包含所有以“;”分隔的文件名,如下所示: sdata=“0000001;0000002;0000003…00000398;00000399;” 代码: 如何解决此问题并将所有文件名放在一个变量中

我有: Arduino MEGA 2560; 以太网+SD屏蔽; SD卡2GB FAT

SD包含400个名为00000000的文件;0000001; 0000002; ... 00000098; 0000099; 0000100; ... 00000398; 00000399

我需要构造字符串var,它将包含所有以“;”分隔的文件名,如下所示: sdata=“0000001;0000002;0000003…00000398;00000399;”

代码:

如何解决此问题并将所有文件名放在一个变量中

信息:400个名称和400个“;”其3600字节。当我尝试读取任何文件并将其所有内容(超过3600字节)放入“stringsdata”时,它工作正常。问题只与上市。
请帮我解决这个问题。

这似乎是您的程序失败的正确位置。这条无辜的线是你的问题:

sdata = sdata + String(cnamefile) + ";";
像这样的字符串拼合将在短时间内使用2倍于sdata的内存。这是您应该如何查看该行中的操作序列

// compiler has done this for you:
String temp1234 = sdata + String();

// note that at this moment, memory usage is now 2x sdata

String temp1235 = temp1234 + ";";

// now you can have 3x the memory used

// assignment to variable
sdata = temp1235;

// now can delete temporary variable
// compiler will do this
//temp1234.delete()
//temp1235.delete()
您正在尝试创建最多3k字节的字符串,但总RAM只有8k,因此无法执行上述操作

这演示了关于字符串的几点。您在一行上的连接不一定比这两行形式更好:

sdata = sdata + String(cnamefile);
sdata = sdata  + ";";
在第二种形式中,确保中间结果只有一个临时变量

这将引出下一个提示。你应该想一想我该如何逃避这个临时变量。这就是为什么我们有+=运算符。您最好的机会是这样连接:

sdata += String(cnamefile);
sdata += ";";
如果字符串类上有+=运算符,编译器将使用它。该运算符可能能够使用更高效的内存连接方式。例如,如果字符串预先分配了一些额外的内存,那么它可以将新字符放入现有的缓冲区

一般来说,这是一种很好的学习受限内存空间中字符串的方法,因为您必须了解一些在大型CPU环境中经常被忽略的编译器内部和运算符细节

考虑到您建议的大小,如果您改变为预先构造字符串缓冲区并用文件名填充它的方法,您可能只能适应RAM。换句话说:不要在微控制器上使用字符串

sdata = sdata + String(cnamefile);
sdata = sdata  + ";";
sdata += String(cnamefile);
sdata += ";";