Передача файла на Ардуино

gonzales
Offline
Зарегистрирован: 13.07.2015

Всем доброго времени суток!

Необходимо реализовать загрузку файла по 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())  не срабатывает, Ардуино думает, что конец файла и обрабатывает хвост. Но на самом деле приходит только половина файла. Далее цикл повторяется и программа дописывает файл до конца.

Вопрос, почему так? И как этого избежать?

gonzales
Offline
Зарегистрирован: 13.07.2015

В ходе экспериментов код преобразился до

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");
  }
}

Если строка закоментирована, то файл создается и у него правильный размер, но посреди файла появляется пара нулевых байтов. Выглядит это вот так

</DeviceInGroup><SceneInGroup/><VirtualIn            s/></Group></Groups><SceneInGroup>

Как я выяснил это всегда последние 13 байт из 2048 байт, как будто в каком-то буфере что-то остается. ТОлько вот что и откуда, неясно

gonzales
Offline
Зарегистрирован: 13.07.2015

упростил задачу до безобразия. Вообще убрал 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");
  }
}

В мониторе

Write-OKgetfile-false
1
128
2
128
3
128
4
128
5
128
6
128
7
128
8
128
9
128
10
128
11
128
12
52
Write-OKgetfile-false
1
128
2
128
3
128
4
128
5
128
6
128
7
128
8
128
9
128
10
128
11
128
12
128
13
128
14
128
15
128
16
128
17
128
18
128
19
84
Write-OKgetfile-false

 

gonzales
Offline
Зарегистрирован: 13.07.2015

Опять делит файл на куски.