我的最终目标是通过XBEE向另一个arduino发送一个30 KB的文件。但是现在我只想在连接到第一个arduino的SD上复制一个4KB的文件。首先,我尝试将数据一个字节一个字节发送。工作和文件成功复制。但我必须有一个缓冲区然后将数据发送到XBEE 64字节数据包,所以我应该能够以64字节数据包读写文件。这就是我所做的:
#include <SD.h>
#include <SPI.h>
void setup() {
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
if (!SD.begin(4)) {
Serial.println("begin failed");
return;
}
File file = SD.open("student.jpg",FILE_READ);
File endFile = SD.open("cop.jpg",FILE_WRITE);
Serial.flush();
char buf[64];
if(file) {
while (file.position() < file.size())
{
while (file.read(buf, sizeof(buf)) == sizeof(buf)) // read chunk of 64bytes
{
Serial.println(((float)file.position()/(float)file.size())*100);//progress %
endFile.write(buf); // Send to xbee via serial
delay(50);
}
}
file.close();
}
}
void loop() {
}
它成功完成其进度直到100%但是当我在笔记本电脑上打开SD时,文件被创建但显示为0 KB文件。
问题是什么?
答案 0 :(得分:2)
你没有告诉while(file.position() < file.size()) {
// The docs tell me this should be file.readBytes... but then I wonder why file.read even compiled for you?
// So if readBytes doesn't work, go back to "read".
int bytesRead = file.readBytes(buf, sizeof(buf));
Serial.println(((float)file.position()/(float)file.size())*100);//progress %
// We have to specify the length! Otherwise it will stop when encountering a null byte...
endFile.write(buf, bytesRead); // Send to xbee via serial
delay(50);
}
缓冲区的长度是多少,所以它会认为它是一个以空字符结尾的字符串(它不是)。
另外,内部循环似乎不仅是不必要的,甚至是有害的,因为如果它少于64个字节,它会跳过最后一个块。
检查出来:
PermutationGenerator