Передача файла на Ардуино
- Войдите на сайт для отправки комментариев
Пнд, 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()) не срабатывает, Ардуино думает, что конец файла и обрабатывает хвост. Но на самом деле приходит только половина файла. Далее цикл повторяется и программа дописывает файл до конца.
Вопрос, почему так? И как этого избежать?
В ходе экспериментов код преобразился до
Константа MAX_BUFFER_SIZE 128
Предыдущая проблема ушла, однако появилось пара новых
1. Если раскоментить DeleteFile, то файл вообще не создается.
Вот код функции
Если строка закоментирована, то файл создается и у него правильный размер, но посреди файла появляется пара нулевых байтов. Выглядит это вот так
Как я выяснил это всегда последние 13 байт из 2048 байт, как будто в каком-то буфере что-то остается. ТОлько вот что и откуда, неясно
упростил задачу до безобразия. Вообще убрал SD-карту
В мониторе
Опять делит файл на куски.