2016-05-04 4 views
1

Моя конечная цель - отправить файл размером 30 КБ на XBEE на другой ардуино. Но пока я просто пытаюсь дублировать файл 4 КБ на SD, подключенный к первому arduino. Сначала я попытался отправить данные по одному байту на один байт. Это сработало и файл успешно дублируется. но я должен иметь буфер, а затем отправлять данные по 64-байтным пакетам в XBEE, чтобы я мог читать и записывать файлы в 64-байтных пакетах. это то, что я сделал:Передача файла с arduino

#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

Добавление комментария: Я просто добавил строку: endFile.close(); Теперь исходный файл находится в 2 КБ и поврежден. но исходный файл - 3 КБ. – alireza

ответ

2

Вы не указали .write, какова длина вашего буфера, поэтому он будет считать, что это строка с нулевым завершением (которой она не является).

Плюс, внутренняя петля оказывается не только ненужной, но даже вредной, поскольку она пропускает последний фрагмент, если он меньше 64 байт.

Проверьте это:

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); 
} 
+0

Спасибо, человек ... U спас меня :) Теперь он работает, файл успешно дублируется – alireza

Смежные вопросы