вопрос по подсчету строк в файле

Тема в разделе "Arduino & Shields", создана пользователем vankenshtein, 4 авг 2015.

  1. vankenshtein

    vankenshtein Нерд

    Добрый день
    Цикл проходит 5 раз а не один. Т.е. если в файле нет строк проходит 5раз, если 1 строка то 6раз и т.д.
    Помогите разобраться
    Код (Text):
    void kolvoStr()
    {
    myFile = SD.open("test3.txt");
      if (myFile) {
        char tmpstr[16];
        char tmpstrlen=0;
        while (myFile.available()) { // читаем первую строку
          tmpstr[tmpstrlen]=myFile.read();
              if ((tmpstr[tmpstrlen]=='\n')||(tmpstr[tmpstrlen]=='\r')) {
                stroki++;
                    Serial.print("stroki");
                        Serial.println(stroki);
                          //break;
            }
        }
        myFile.close();
      } else {
        Serial.println("error opening test3.txt");
      }
     
  2. AlexVS

    AlexVS Гик

    А какую библиотеку используешь? Может myFile.read() читает символ, а не строку?
    В этом случае нужно писать что то типа
    result=file.readLn(textBuffer, 80);
     
  3. vankenshtein

    vankenshtein Нерд

    спасибо за совет! буду пробовать
    библиотека стандартная arduoino 1.0.5
     
  4. vankenshtein

    vankenshtein Нерд

    80 это количество символов в строке? в моем случае указать 16?
     
  5. vankenshtein

    vankenshtein Нерд

    myFile.read() читает символ, но не совсем понимаю как сделать, после миганием светодиодами и кручением сервой сложновато пока понять что и как
     
  6. AlexVS

    AlexVS Гик

    Это не библиотека а среда Arduino IDE. А библиотека это то что вы в #include указали.
    Например
    Код (Text):
    #include <tinyFAT.h>
     
  7. vankenshtein

    vankenshtein Нерд

    я имел ввиду библиотека стандартная которая включена в с реду Arduino IDE
     
  8. vankenshtein

    vankenshtein Нерд

    вот весь код
    Код (Text):

    #include <SD.h>


    int offbt = 37;
    int podacha10bt3 = 30;  
    int podacha1bt3 = 31;
    int kurokbt3 = 36;

    File myFile;
    int stroki;
    static boolean outoffbt = LOW;
    static boolean output3_3 = LOW;
    int menuup_flag=0;
    int Recflag=0;
    void setup()
    {
      Serial.begin(9600);
      Serial.print("Initializing SD card...");
      pinMode(53, OUTPUT);
     
      if (!SD.begin(10)) {
        Serial.println("initialization failed!");
        return;
      }
      Serial.println("initialization done.");
    }

    void loop()
    {
      output3_3 = digitalRead(kurokbt3);
      outoffbt = digitalRead(offbt);
    if(outoffbt == LOW  && Recflag==0)
        {
          Recflag=1;
          }
      if(outoffbt == HIGH && Recflag==1){
        writeStr();
    Recflag=0;
        }  
       
        if(output3_3 == LOW && menuup_flag==0)
        {
          menuup_flag=1;
          }
    if (output3_3 == HIGH && menuup_flag==1)
    {
      kolvoStr();
    menuup_flag=1;
    }

    }

    void kolvoStr()
    {
    myFile = SD.open("test3.txt");
      if (myFile) {
        char tmpstr[16];
        char tmpstrlen=0;
        while (myFile.available()) { // читаем первую строку
          tmpstr[tmpstrlen]=myFile.read();
              if ((tmpstr[tmpstrlen]=='\n')||(tmpstr[tmpstrlen]=='\r')) {
                stroki++;
                    Serial.print("stroki");
                        Serial.println(stroki);
                          //break;
            }
        }
        myFile.close();
      } else {
        Serial.println("error opening test3.txt");
      }
    }

    void writeStr()
    {
    myFile = SD.open("test3.txt", FILE_WRITE);
      if (myFile) {
        Serial.print("Writing to test4.txt...");
        myFile.println("testing 1, 2, 3.");
        myFile.close();
        Serial.println("done.");
      } else {
        Serial.println("error opening test4.txt");
      }
    }
     
  9. AlexVS

    AlexVS Гик

    Возможно, что эта библиотека не может читать построчно, смотрите в сторону SdFat.h или tinyFAT.h.
    Последнюю надо найти и скачать.
     
  10. vankenshtein

    vankenshtein Нерд

    если я не ошибаюсь тут мы отсчитываем 16 символов, т.е. одна строка
    Код (Text):
    char tmpstr[16];
        char tmpstrlen=0;
        while (myFile.available()) { // читаем первую строку
          tmpstr[tmpstrlen]=myFile.read();
     
  11. AlexVS

    AlexVS Гик

    Извините, не разглядел ваш код, действительно вы посимвольно выбираете строку.
    Но почему всегда в 0 позицию? tmpstrlen всегда = 0?
     
  12. vankenshtein

    vankenshtein Нерд


    Код (Text):
    char tmpstrlen = stroki;
    так правильно будет?
     
  13. vankenshtein

    vankenshtein Нерд

    похоже что нет((
     
  14. AlexVS

    AlexVS Гик

    А почему вы ее объявили как символьную переменную, а не числовую? Ведь это счетчик?
     
  15. vankenshtein

    vankenshtein Нерд

    кусок кода выдрал с форума, только учусь
    char tmpstr[16];
    int tmpstrlen=0;

    не подскажете что дальше делать?
     
  16. AlexVS

    AlexVS Гик

    К сожалению я сам не особо силен в Си, но попробуйте так:
    Код (Text):
        while (myFile.available()) { // читаем первую строку
          tmpstr[tmpstrlen]=myFile.read();
          tmpstrlen++;
              if ((tmpstr[tmpstrlen]=='\n')||(tmpstr[tmpstrlen]=='\r')) {
                stroki++;
                tmpstrlen=0;
            }
        }
     
    vankenshtein нравится это.
  17. vankenshtein

    vankenshtein Нерд

    ура заработало)))
    Код (Text):
     myFile = SD.open("test4.txt");
      if (myFile) {
        char tmpstr[16]; //кол-во символов в строке
        int tmpstrlen=0;
        while (myFile.available()) { // читаем первую строку
          tmpstr[tmpstrlen]=myFile.read();
              if (tmpstr[tmpstrlen]=='\n')
                tmpstrlen++;        
        }
        myFile.close();
        Serial.print("stroki");
        Serial.println(tmpstrlen);  
      }
    AlexVS, спасибо вам большое за помощь
     
    Последнее редактирование: 5 авг 2015
  18. Evgen_Br

    Evgen_Br Нуб

    можете подсказать?
    пытаюсь к ардуине нано подключить microSD карту.
    есть библиотека SD.h (родная с ардуино), скачал еще SdFat.h
    в примерах есть скетч дающий информацию о карте. карта на 2 гига microCD class 4, фирма mirex

    почему SD.h не инициализирует карту (сообщение: Card type: SD2 Could not find FAT16/FAT32 partition.
    Make sure you've formatted the card), а SdFat.h ее видит?