Парсинг текстового файла с SD карты

Тема в разделе "Arduino & Shields", создана пользователем alexval2007, 1 июл 2018.

  1. Daniil

    Daniil Гуру

    Да, и я указывал, что раньше обрабатывали только последнюю строку.
    Сейчас что? Как я понял, у вас есть код, который "парсит" файл, который записан в память мк.
    Теперь вы хотите добавить чтение из карты и в предпоследнем сообщении что-то работало, а что-то нет.
     
  2. alexval2007

    alexval2007 Нерд

    Да Данил вы правы тот код что берет константу из памяти мк отлично работает и меня устраивает осталост вместо константы прекрепить туда чтение файла с карты а вот последний код где я пытался нормально прочитать с карты нерабоьает и как я понял его в корне надо менять потому как само чтоение слелано неверно. Есть код более нормальный на основе примера одного форумчанина с похожей зачей только парсинг кода там немного другой но я думаю можно настроить. Чуть позже выложу код. Но он еще неотлажен хоть автор заверяет что должен работать.
    Вот код
    Код (C++):
    //----------------------------------------------------------------------------------------
    #include <SD.h>
    #include <SPI.h>
    #include <string.h>
    //----------------------------------------------------------------------------------------
    const int chipSelect = 53;  // Номер пина для CD карты для MEGA CS
    File configFile;
    boolean SDfound;
    //----------------------------------------------------------------------------------------
    void setup()
    {

      char *buffer;
      //char buffer[5];//малый буффер для strtok();
      //создание "большого" буффера для данных, насчет этой строчки
      //не уверен так как примеров как работает команда file.size();
      //невидел, в принципе, по идее можно заменить на char array[configFile.avialable()+1];
      char array[configFile.size() + 1];
      //char array[configFile.avialable()+1];
                                                                   
      //двумерный массив данных для принемаемых значений,
      //по желанию можно изменить его в массив типа int для
      //мат операций над данными и естественно пользоваться функцией atoi                            
      char OutArray[configFile.size() / 2 + 1];
                                                                                   
      char symbol;
      int h = 0;//вспомогательные переменные
      int i = 0;//вспомогательные переменные

      Serial.begin(9600); // Инициализируем UART.
      while (!Serial);
      pinMode(chipSelect, OUTPUT);// Настроим выход выбора микросхемы на вывод.
                     
      if (SDfound == 0)
      {
        if (!SD.begin(chipSelect))
        {
          Serial.print("The SD card cannot be found");
          while(1);
        }
      }
      SDfound = 1;

      if (configFile)
      {
         Serial.println("Fail open OK");
      }
      else
      {
         Serial.println("Fail open ERROR");
      }

      configFile = SD.open("TEST.zpl");//считывание и присваивание адресса файлу

      while (configFile.available())
      {
          // считываем байт из файла
          symbol = configFile.read();// присваивание символа переменной symbol
          array[h] = symbol;         // сохраним переменную symbol в массив.
          //Serial.println(array[h]);
          h++;
          delay(1);
       }
        array[h]= '\0';    //закрываем массив (добавления символа окончания строки для функции strtok() поэтому и "+1" при обьявлении array)
        configFile.close();//закроем файл


        buffer = strtok(array, ";"); //если нужно что бы разделение было и по признаку "." тогда перепишите     strtok(array,";.");
        h = 0;


        while(buffer != NULL) //для этого и добавлялся  '\0'в конце array
        {
            Serial.println(buffer);
            strcpy(OutArray[h], buffer);//компирование "строчки в строчку",простым "=" тут не обойтись,надеюсь с "0" я не перемудрил
            h++;
        }
     
        for(i = 0; i < h; i++)
        {
          Serial.println(OutArray[i]);//тут особо не обращайте внимание,остюда уже идут операции размещения считанных данных куда вам надо по массивам
        }
    }
    //----------------------------------------------------------------------------------------
    void loop()
    {

    }
    //----------------------------------------------------------------------------------------
    Тут я тоже неуверен читает побайтно в переменную char а у меня там по сути строки незнаю правильно ли это
     
    Последнее редактирование: 2 июл 2018
    Daniil нравится это.
  3. alexval2007

    alexval2007 Нерд

    будем разбирать и отлаживать код по частям сначала чтение с карты вроде все работает стабильно
    Посмотрите всё ли правильно в коде может что то переделать
    Код (C++):
    //----------------------------------------------------------------------------------------
    #include <SD.h>
    #include <SPI.h>
    #include <string.h>
    //----------------------------------------------------------------------------------------
    const int chipSelect = 53;  // Номер пина для CD карты для MEGA CS
    File configFile;
    boolean SDfound;
    //----------------------------------------------------------------------------------------
    void setup()
    {
      char *buffer;
      //char buffer[5];//малый буффер для strtok();
      //создание "большого" буффера для данных, насчет этой строчки
      //не уверен так как примеров как работает команда file.size();
      //невидел, в принципе, по идее можно заменить на char array[configFile.avialable()+1];
      char array[configFile.size() + 1];
      //char array[configFile.avialable()+1];
                                                               
      //двумерный массив данных для принемаемых значений,
      //по желанию можно изменить его в массив типа int для
      //мат операций над данными и естественно пользоваться функцией atoi                        
      //char OutArray[configFile.size() / 2 + 1];
      char OutArray[configFile.size() + 1];                                                                        
      char symbol;
      int h = 0;//вспомогательные переменные
      int i = 0;//вспомогательные переменные

      Serial.begin(9600); // Инициализируем UART.
      while (!Serial);
      pinMode(chipSelect, OUTPUT);// Настроим выход выбора микросхемы на вывод.
                   
      if (SDfound == 0)
      {
        if (!SD.begin(chipSelect))
        {
          Serial.print("The SD card cannot be found");
          while(1);
        }
      }
      SDfound = 1;

      if (!configFile)
      {
         Serial.println("Fail open OK");
      }
      else
      {
         Serial.println("Fail open ERROR");
      }

      configFile = SD.open("TEST.zpl");//считывание и присваивание адресса файлу

      while (configFile.available())
      {
          // считываем байт из файла
          symbol = configFile.read();// присваивание символа переменной symbol
          array[h] = symbol;         // сохраним переменную symbol в массив.
          //Serial.println(array[h]);
          h++;
          delay(1);
       }
        array[h]= '\0';    //закрываем массив (добавления символа окончания строки для функции strtok() поэтому и "+1" при объявлении array)
        configFile.close();//закроем файл
    }
    //----------------------------------------------------------------------------------------
    void loop()
    {

    }
    //----------------------------------------------------------------------------------------
    вот что на выходе
    // 1;1;00:09.207;00:10.207;00:01.000;01.000;;; //43 байта
    // 1;2;00:12.207;00:15.207;00:01.000;03.000;;;
    // 1;3;00:19.142;00:20.142;00:01.000;01.000;;;
    только он это выдаёт по символьно в столбик
    но так и должно быть по идее вывод побайтовый ведь
     
  4. alexval2007

    alexval2007 Нерд

    в авторском варианте парсинг не пошёл
    Код (C++):
    //----------------------------------------------------------------------------------------
    #include <SD.h>
    #include <SPI.h>
    #include <string.h>
    //----------------------------------------------------------------------------------------
    const int chipSelect = 53;  // Номер пина для CD карты для MEGA CS
    File configFile;
    boolean SDfound;
    //----------------------------------------------------------------------------------------
    void setup()
    {
      char *buffer;
      //char buffer[5];//малый буффер для strtok();
      //создание "большого" буффера для данных, насчет этой строчки
      //не уверен так как примеров как работает команда file.size();
      //невидел, в принципе, по идее можно заменить на char array[configFile.avialable()+1];
      //char array[configFile.size() + 1];
      char array[]={};
                                                                 
      //двумерный массив данных для принемаемых значений,
      //по желанию можно изменить его в массив типа int для
      //мат операций над данными и естественно пользоваться функцией atoi                          
      //char OutArray[configFile.size() / 2 + 1];
      char OutArray[configFile.size() + 1];                                                                          
      char symbol;
      int h = 0;//вспомогательные переменные
      int i = 0;//вспомогательные переменные
      int nparsed = 0;

      Serial.begin(9600); // Инициализируем UART.
      while (!Serial);
      pinMode(chipSelect, OUTPUT);// Настроим выход выбора микросхемы на вывод.
                     
      if (SDfound == 0)
      {
        if (!SD.begin(chipSelect))
        {
          Serial.print("The SD card cannot be found");
          while(1);
        }
      }
      SDfound = 1;

      if (!configFile)
      {
         Serial.println("Fail open OK");
      }
      else
      {
         Serial.println("Fail open ERROR");
      }

      configFile = SD.open("TEST.zpl");//считывание и присваивание адресса файлу
     
      if (configFile)
      {
        while (configFile.available())
        {
          // считываем байт из файла
          symbol = configFile.read();// присваивание символа переменной symbol
          array[h] = symbol;         // сохраним переменную symbol в массив.
          //Serial.println(array[h]);
          h++;
          delay(1);
         }
        array[h]= '\0';    //закрываем массив (добавления символа окончания строки для функции strtok() поэтому и "+1" при обьявлении array)
        configFile.close();//закроем файл
      }
     
        buffer = strtok(array, ";"); //если нужно что бы разделение было и по признаку "." тогда перепишите     strtok(array,";.");
        h = 0;

        while(buffer != NULL) // остановим цикл когда дойдём до символа '\0' (для этого мы его и добавляли в конце array)
        {
            //Serial.println(buffer);
            strcpy(OutArray[h], buffer);//компирование "строчки в строчку", простым "=" тут не обойтись, надеюсь с "0" я не перемудрил
            h++;
        }

        for(i = 0; i < h; i++)
        {
          Serial.println(OutArray[i]);//тут особо не обращайте внимание,остюда уже идут операции размещения считанных данных куда вам надо по массивам
        }
    }
    //----------------------------------------------------------------------------------------
    void loop()
    {

    }
    //----------------------------------------------------------------------------------------
    В предложенном вами тоже нет ответа в терминале
    Код (C++):
    //----------------------------------------------------------------------------------------
    #include <SD.h>
    #include <SPI.h>
    #include <string.h>
    //----------------------------------------------------------------------------------------
    const int chipSelect = 53;  // Номер пина для CD карты для MEGA CS
    File configFile;
    boolean SDfound;
    //----------------------------------------------------------------------------------------
    void setup()
    {
      char *buffer;
      //char buffer[5];//малый буффер для strtok();
      //создание "большого" буффера для данных, насчет этой строчки
      //не уверен так как примеров как работает команда file.size();
      //невидел, в принципе, по идее можно заменить на char array[configFile.avialable()+1];
      //char array[configFile.size() + 1];
      char array[]={};
                                                                 
      //двумерный массив данных для принемаемых значений,
      //по желанию можно изменить его в массив типа int для
      //мат операций над данными и естественно пользоваться функцией atoi                          
      //char OutArray[configFile.size() / 2 + 1];
      char OutArray[configFile.size() + 1];                                                                          
      char symbol;
      int h = 0;//вспомогательные переменные
      int i = 0;//вспомогательные переменные
      int nparsed = 0;

      Serial.begin(9600); // Инициализируем UART.
      while (!Serial);
      pinMode(chipSelect, OUTPUT);// Настроим выход выбора микросхемы на вывод.
                     
      if (SDfound == 0)
      {
        if (!SD.begin(chipSelect))
        {
          Serial.print("The SD card cannot be found");
          while(1);
        }
      }
      SDfound = 1;

      if (!configFile)
      {
         Serial.println("Fail open OK");
      }
      else
      {
         Serial.println("Fail open ERROR");
      }

      configFile = SD.open("TEST.zpl");//считывание и присваивание адресса файлу
     
      if (configFile)
      {
        while (configFile.available())
        {
          // считываем байт из файла
          symbol = configFile.read();// присваивание символа переменной symbol
          array[h] = symbol;         // сохраним переменную symbol в массив.
          //Serial.println(array[h]);
          h++;
          delay(1);
         }
        array[h]= '\0';    //закрываем массив (добавления символа окончания строки для функции strtok() поэтому и "+1" при объявлении array)
        configFile.close();//закроем файл
      }
     
        char *p = strtok(array, ";");
        while (p)
        {
          OutArray[nparsed] = p;
          nparsed++;
          p = strtok(NULL, ";\n");
        }
          Serial.println(OutArray);
    }
    //----------------------------------------------------------------------------------------
    void loop()
    {

    }
    //----------------------------------------------------------------------------------------
     
  5. Daniil

    Daniil Гуру

    божечки:(
     
  6. parovoZZ

    parovoZZ Гуру

    ТС, без дебага да пальцем в небо будешь ещё долго вымучивать свой код. Ставь атмел студио, вижуал микро и там дебажь. Сразу откроется истина. Либо в своем коде вставляй метки с выводом в порт и смотри куда и как отрабатывает программа.
     
  7. alexval2007

    alexval2007 Нерд

    да наверно так и придется
     
  8. b707

    b707 Гуру

    лучше все-таки вникните, чем указатель на символ отличается от символа и как устроены char array в Си.
    Без понимания этого вам никакой дебаг не поможет. А когда разберетесь - увидите, что кода в вашем парсинге реально на 10 строк.
     
    Daniil и Mitrandir нравится это.