глюк записи в SD

inspiritus
Offline
Зарегистрирован: 17.12.2012

Здравствуйте уважаемые коллеги.

вот всю голову сломал...

 String logstring = "";
 char* log_filename ="log2.csv"; 
//**********************************************************
 dataFile = SD.open(log_filename, FILE_WRITE);
  if (dataFile) {
  logstring = "Date,Time";
  dataFile.print(logstring);dataFile.flush();
  Serial.print(logstring);  
  for (byte i = 0; i <54 ; i++){
  logstring = ",";
  logstring += i;
  dataFile.print(logstring);dataFile.flush();
  Serial.print(logstring);  
  }
dataFile.close();

в сериал выводит

Date,Time,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53

в файл пишет
Date,Time,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42
 
пробовал формировать всю лог-строеу и потом ее писать одним махом, тоже недописывает, только до 51, причем, если пишутся именно какие то строки, то может оборвать строку. пробовал разбивать запись на два куска 0-27 и 27-54 , все то же самое...
 
вроде бы и мега не забита насмерть.
Скетч использует 35494 байт (13%) памяти устройства. Всего доступно 253952 байт.
Глобальные переменные используют 4863 байт (59%) динамической памяти, оставляя 3329 байт для локальных переменных. Максимум: 8192 байт.
 
может кто подскажет куда копать?

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

кажется зацепился.

проверил не выгрузку лога, а сам лог на SD, там все ОК.

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

//*************** если есть запрос по порту 32000 - выгрузка лог файла *********
  EthernetClient client1 = server1.available();
  if (client1) {
    while (client1.connected()) {
      if (client1.available()) {
        char c = client1.read();
        if (readString.length() < 100) {
          readString += c;
        }
        if (c == '\n') {
          
 
 
    myFile = SD.open(log_filename);         
         client1.println(F("HTTP/1.1 200 OK"));
          client1.println("Content-Disposition: form-data; name=\"description\"");
          client1.println("Content-Type: text/text");
          client1.println();
           byte cB[64];
           int cC=0;
    while (myFile.available())
       {
         cB[cC]=myFile.read();
         cC++;
       if(cC > 63)
        {
         client1.write(cB,64);
        cC=0;
        }
       }
   myFile.close();
   client1.println();
         delay(10);
          client1.stop();}}}}
//*************** конец обработки запроса по порту 32000 ***********************

то есть, если файл закончился раньше, чем счетчик блока, то незаполненный полностью блок пропадает.

когда лог большой, то это было незаметно ,я списывал на обрывы коннекта и глюки сети, но вот на единичной записи вылезло во-всю красоту :))

решается добавлением 

   client1.write(cB,cC);    

 

перед закрытием файла.