Передача файла на Ардуино
- Войдите на сайт для отправки комментариев
Пнд, 06/02/2017 - 14:31
Всем доброго времени суток!
Необходимо реализовать загрузку файла по TCP на SD-карту Ардуино.
На данный момент код такой
void Getfile() {
int filesize = 0;
String filename ="Uploads/UmDom.xml";
SWITCH_TO_SD;
// if (SD.exists(filename)) {
// SD.remove(filename);
// }
SWITCH_TO_W5100;
EthernetClient client = server.available();
if (client) {
SWITCH_TO_W5100;
while (client.available()) {
SWITCH_TO_W5100;
filebuffer[filesize] = client.read();
filesize = filesize + 1;
delay(1);
if (filesize >= MAX_BUFFER_SIZE) {
DebugPrint("FileSize-");
DebugPrintln(filesize);
SWITCH_TO_SD;
File myFile = SD.open(filename, FILE_WRITE);
if (myFile) {
myFile.seek(pos);
size_t t = myFile.write(filebuffer, filesize);
myFile.flush();
myFile.close();
DebugPrint("Write-");
DebugPrintln(byte(t));
DebugPrint("Size-");
DebugPrintln(pos);
pos = pos + filesize;
filesize = 0;
SWITCH_TO_W5100;
}
}
}
if (filesize > 0) {
SWITCH_TO_SD;
File myFile = SD.open(filename, FILE_WRITE);
if (myFile) {
myFile.seek(pos);
size_t t = myFile.write(filebuffer, filesize);
DebugPrint("LastWrite-");
DebugPrintln(byte(t));
DebugPrint("Size-");
DebugPrintln(pos);
myFile.flush();
myFile.close();
pos = pos + filesize;
}
}
DebugPrint("Write-OK");
//getfile = false;
DebugPrint("getfile-false");
}
}
Соответственно в LOOP
void loop() {
CheckRS485();
if (getfile==false){
CheckEthernet();
}
else {
Getfile();
}
}
В мониторе наблюдаю
FileSize-32 Write-32 Size-0 FileSize-32 Write-32 Size-32 FileSize-32 Write-32 Size-64 FileSize-32 Write-32 Size-96 FileSize-32 Write-32 Size-128 FileSize-32 Write-32 Size-160 FileSize-32 Write-32 Size-192 FileSize-32 Write-32 Size-224 FileSize-32 Write-32 Size-256 FileSize-32 Write-32 Size-288 FileSize-32 Write-32 Size-320 FileSize-32 Write-32 Size-352 FileSize-32 Write-32 Size-384 FileSize-32 Write-32 Size-416 FileSize-32 Write-32 Size-448 FileSize-32 Write-32 Size-480 FileSize-32 Write-32 Size-512 FileSize-32 Write-32 Size-544 FileSize-32 Write-32 Size-576 FileSize-32 Write-32 Size-608 FileSize-32 Write-32 Size-640 FileSize-32 Write-32 Size-672 FileSize-32 Write-32 Size-704 FileSize-32 Write-32 Size-736 FileSize-32 Write-32 Size-768 FileSize-32 Write-32 Size-800 FileSize-32 Write-32 Size-832 FileSize-32 Write-32 Size-864 FileSize-32 Write-32 Size-896 FileSize-32 Write-32 Size-928 FileSize-32 Write-32 Size-960 FileSize-32 Write-32 Size-992 FileSize-32 Write-32 Size-1024 FileSize-32 Write-32 Size-1056 FileSize-32 Write-32 Size-1088 FileSize-32 Write-32 Size-1120 FileSize-32 Write-32 Size-1152 FileSize-32 Write-32 Size-1184 FileSize-32 Write-32 Size-1216 FileSize-32 Write-32 Size-1248 FileSize-32 Write-32 Size-1280 FileSize-32 Write-32 Size-1312 FileSize-32 Write-32 Size-1344 FileSize-32 Write-32 Size-1376 FileSize-32 Write-32 Size-1408 LastWrite-20 Size-1440 Write-OKgetfile-falseFileSize-32 Write-32 Size-1460 FileSize-32 Write-32 Size-1492 FileSize-32 Write-32 Size-1524 FileSize-32 Write-32 Size-1556 FileSize-32 Write-32 Size-1588 FileSize-32 Write-32 Size-1620 FileSize-32 Write-32 Size-1652 FileSize-32 Write-32 Size-1684 FileSize-32 Write-32 Size-1716 FileSize-32 Write-32 Size-1748 FileSize-32 Write-32 Size-1780 FileSize-32 Write-32 Size-1812 FileSize-32 Write-32 Size-1844 FileSize-32 Write-32 Size-1876 FileSize-32 Write-32 Size-1908 FileSize-32 Write-32 Size-1940 FileSize-32 Write-32 Size-1972 FileSize-32 Write-32 Size-2004 FileSize-32 Write-32 Size-2036 FileSize-32 Write-32 Size-2068 FileSize-32 Write-32 Size-2100 FileSize-32 Write-32 Size-2132 FileSize-32 Write-32 Size-2164 FileSize-32 Write-32 Size-2196 FileSize-32 Write-32 Size-2228 FileSize-32 Write-32 Size-2260 FileSize-32 Write-32 Size-2292 FileSize-32 Write-32 Size-2324 FileSize-32 Write-32 Size-2356 FileSize-32 Write-32 Size-2388 FileSize-32 Write-32 Size-2420 FileSize-32 Write-32 Size-2452 FileSize-32 Write-32 Size-2484 FileSize-32 Write-32 Size-2516 FileSize-32 Write-32 Size-2548 FileSize-32 Write-32 Size-2580 FileSize-32 Write-32 Size-2612 FileSize-32 Write-32 Size-2644 FileSize-32 Write-32 Size-2676 FileSize-32 Write-32 Size-2708 FileSize-32 Write-32 Size-2740 LastWrite-3 Size-2772 Write-OKgetfile-false
То есть в какой-то момент while (client.available()) не срабатывает, Ардуино думает, что конец файла и обрабатывает хвост. Но на самом деле приходит только половина файла. Далее цикл повторяется и программа дописывает файл до конца.
Вопрос, почему так? И как этого избежать?
В ходе экспериментов код преобразился до
void Getfile() { File myFile; int filesize = 0; byte *filebuffer = new byte[MAX_BUFFER_SIZE]; String filename = "Uploads/UmDom.xml"; //DeleteFile(filename); SWITCH_TO_W5100; EthernetClient client = server.available(); if (client) { SWITCH_TO_W5100; while (client.available()) { SWITCH_TO_W5100; client.read(filebuffer, MAX_BUFFER_SIZE); SWITCH_TO_SD; myFile = SD.open(filename, FILE_WRITE); if (myFile) { myFile.seek(pos); size_t t = myFile.write(filebuffer, MAX_BUFFER_SIZE); myFile.flush(); DebugPrintln(byte(t)); pos = pos + MAX_BUFFER_SIZE; SWITCH_TO_W5100; } } myFile.close(); delete filebuffer; DebugPrint("Write-OK"); //getfile = false; DebugPrint("getfile-false"); } }Константа MAX_BUFFER_SIZE 128
Предыдущая проблема ушла, однако появилось пара новых
1. Если раскоментить DeleteFile, то файл вообще не создается.
Вот код функции
bool DeleteFile (String filename) { SWITCH_TO_SD; if (SD.exists(filename)) { return SD.remove(filename); DebugPrintln("delete file"); } }Если строка закоментирована, то файл создается и у него правильный размер, но посреди файла появляется пара нулевых байтов. Выглядит это вот так
Как я выяснил это всегда последние 13 байт из 2048 байт, как будто в каком-то буфере что-то остается. ТОлько вот что и откуда, неясно
упростил задачу до безобразия. Вообще убрал SD-карту
void Getfile() { File myFile; int filesize = 1; byte filebuffer[MAX_BUFFER_SIZE]; String filename = "Uploads/test.txt"; //DeleteFile(filename); SWITCH_TO_W5100; EthernetClient client = server.available(); if (client) { while (client.available()) { int t=client.read(filebuffer, MAX_BUFFER_SIZE); delay(100); DebugPrintln(filesize); DebugPrintln(t); filesize=filesize+1; } DebugPrint("Write-OK"); DebugPrintln("getfile-false"); } }В мониторе
Опять делит файл на куски.