SD модуль

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

  1. filay23

    filay23 Нерд

    Добрый день подскажите пожалуйста! На sd карте находится документ txt с такими данными (345, 456),(345,676),(67,908),...
    как их можно считать и записать в одномерный численный массив(long) для дальнейшей обработки???
     
  2. ANV

    ANV Гуру

    filay23 нравится это.
  3. filay23

    filay23 Нерд

    Данный код прорабатывала. Не получается считать массив (345, 456),(345,676),(67,908), который находится в файле на sd в переменную long[ ].
    ниже приведен код, но он не работает (зацикливается)
    //=================================================================
    fileReadShifr = SD.open("SHIFR.txt");
    if (fileReadShifr)
    {
    int i=0;
    while (fileReadShifr.available())
    {
    char c = fileReadShifr.read();
    SLOVO_SHIFR = c;
    i++;
    Serial.print(SLOVO_SHIFR[2]);
    delay(1);
    }
    SLOVO_SHIFR= '\0';
    fileReadShifr.close();
    }
     
  4. filay23

    filay23 Нерд

    В мониторинг порта выводит то что в файле, а как эти значения записать в переменную long[ ]?????
     
  5. ANV

    ANV Гуру

    Чтобы упростить программу скажите:
    1. Какой размер массива
    2. Обязательно ли хранить данные в виде "(345, 456),(345,676),(67,908)" или можно по другому сделать, например "345 456 345 676 67 908"
     
  6. filay23

    filay23 Нерд


    Суть программы следующая: есть текст в файле, его шифрую результат шифровки координаты (х, у) в виде цифр их я записала в файл, а сейчас проблема их считать в переменную для дальнейшей операции расшифрования.
     
  7. filay23

    filay23 Нерд

    в функции расшифрования участвуют и х и у.
     
  8. ANV

    ANV Гуру

    И сколько этих координат?
     
  9. filay23

    filay23 Нерд

    в зависимости от текста одна буква одна координата. длину то можно считать через strlen( )
     
  10. filay23

    filay23 Нерд

    как Вы мне бы посоветовали это реализовать?
     
  11. ANV

    ANV Гуру

    Вам надо написать парсер текстовой строки
    Т.к. файл с данными подготовили сами, то можно предположить, что в нем нет синтаксических ошибок. На основании этого предположения получается что в строке надо откинуть все лишние символы в встречающиеся цифры сложить в числа и преобразовать в long

    Т.е. алгоритм такой:
    0. Coord_x = 0; coord_y = 0;
    1. Считать символ sym, если символ не является цифрой (функция IsDigit), то вернуться к пункту 1
    2. Coord_x = coord_x * 10 + (sym - 48); - так накапливаем цифра за цифрой наш long
    3. Считываем символ. Если цифра, то переходим к пункту 2, если не цифра, то к пункту 4
    4. Повторить пункты 1-3, но уже для координаты У

    Выполняя все это не забываем проверять не закончился ли файл
     
    filay23 нравится это.
  12. dnk

    dnk Нерд

    Попробуйте http://www.arduino.cc/en/Reference/StreamParseInt. Сам не проверял, но судя по описанию, Вам просто надо в цикле вызывать parseInt, каждые два последовательных вызова образуют пару координат.
     
    filay23 нравится это.
  13. filay23

    filay23 Нерд

    Спасибо Вам большое буду пробовать!!!
     
  14. filay23

    filay23 Нерд

    Как сделать парсер я разобралась, но не могу считать символы с файла в переменную. Когда пытаюсь вывести символ Serial.print(SLOVO_SHIFR[2]); то происходит зацикливание и печатается белиберда

    Код (Text):
    /*
    * SD карта подключается так:
    ** MOSI - пин 11
    ** MISO - пин 12
    ** CLK - пин 13
    ** CS - пин 4
    */
    #include <iostream>
    #include <stdio.h>
    #include <string>
    #include <limits.h>
    #include <iostream>
    #include <string.h>
    #include <SD.h>

    // Глобальные переменные
    long BukvaToKoord[]={0,0};
    long BukvaToKoord_GAMMA[]={0,0};
    char Point_to_bukva[]="";
    long S[] = { 0,0 };
    long V[] = { 0,0 };
    long W[] = { 0,0 };
    char ALF[]= {' ','!','$','%',
                  '&','(',')','*','+',',','-',
                  '.','/','0','1','2','3','4','5',
                  '6','7','8','9',':',';','?',
                  'A','B','C','D','E',
                  'F','G','H','I','J','K','L',
                  'M','N','O','P','Q','R','S',
                  'T','U','V','W','X','Y','Z',
                  '_','a','b',
                  'c','d','e','f','g','h','i','j',
                  'k','l','m','n','o','p','q','r','s',
                  't','u','v','w','x','y','z','{',
                  '}'
                };
    int ALFAVIT[][2] ={{33,355},{33,396},
                      {34,74},{36,664},{39,580},
                      {43,224},{43,527},{44,366},{44,385},{45,31},{45,720},
                      {47,349},{47,402},{48,49},{48,702},{49,183},{49,568},
                      {53,277},{53,474},{56,332},{56,419},{58,139},{58,612},
                      {59,365},{59,386},{62,379},
                      {66,552},{67,84},{67,667},{69,241},{69,510},
                      {70,195},{70,556},{72,254},{72,497},{73,72},{73,679},
                      {74,170},{74,581},{75,318},{75,433},{78,271},{78,480},
                      {79,111},{79,640},{80,318},{80,433},{82,270},{82,481},
                      {83,373},{83,378},{85,35},{86,25},
                      {93,484},{98,338},{98,413},
                      {99,295},{99,456},{100,364},{100,387},{102,267},{102,484},
                      {105,369},{105,382},{106,24},{106,727},{108,247},{108,504},
                      {109,200},{109,551},{110,129},{110,622},{114,144},{114,607},
                      {115,242},{115,509},{116,92},{116,659},{120,147},{120,604},
                      {125,459},{189,297}};
    // функция mod================================================================
      long mod( long A, long p)
        {
          long B;
            if (A < 0)
                B=(A % p) + p;
            else
                B = A % p;
            return B;
          }
    //===========mod_inverse======================================================
      long mod_inverse(long a, long n)
        {
          long v = 0, i = n, d = 1;
                if (a < 0)
                    a = a + n;
                while (a > 0)
                {
                    long t =  i / a, x = a;
                      a = mod(i , x);
                      i = x;
                      x = d;
                      d = v - t * x;
                      v = x;
                }
                      v %= n;
                  if (v < 0) v = mod((v + n) , n);
                      return v;
          }
    //===================Функция степени==========================================
      long  QuickPow(long x, long y)
          {
            long result = 1;
              while (y > 0)
                {
                  if ((y & 1) == 1)
                      result *= x;
                        x *= x;
                          y >>= 1;
                  }
                  return result;
            }
    //============Функция POINT_ADD===============================================
      long * POINT_ADD(long P[], long Q[], long p)
            {
         
            }
    //======Функция Вычитания==================================================
      long* VUCH(long P[], long Q[], long p)
          {
         
               
            }
    //============Перевод слова в координаты===================================
      long *PEREVOD(char Bukva)
          {
           
          }
    //======Перевод гаммы в координаты=========================================
      long *PEREVOD_GAMMA(char Bukva_GAMMA)
          {
                int i=0;
                  while(Bukva_GAMMA!=ALF[i])
                        {
                          i++;
                        }
                          BukvaToKoord_GAMMA[0]=ALFAVIT[i][0];
                          BukvaToKoord_GAMMA[1]=ALFAVIT[i][1];
          }
    //=======перевод из координат в символ=====================================  
      char* PEREVOD_2(long Point[])
          {
                for (int i=0;i<80;i++)
                {
                  if(Point[0]==ALFAVIT[i][0])
                    {
                        if(Point[1]==ALFAVIT[i][1])
                        {
                          Point_to_bukva[0]=ALF[i];
                        }
                      }
                  }
          }

    File fileWrite;
    File fileReadSlovo;
    File fileReadGamma;
    File fileReadShifr;

    void setup()
    {
      char SLOVO[]="";
      char* bufer;
      char SLOVO_GAMMA[]="";
      char SLOVO_SHIFR[]="";
      char* CIFRA_SHIFR[]={};
      long p=751;
      long MASSIV[]={0,0};
      long MASSIV_GAMMA[]={0,0};
    // Open serial communications and wait for port to open:
      Serial.begin(9600);
      ///  Serial.print("Initializing SD card...");
      // Магия. Этот вывод должен быть настроен как выход.
      // Иначе, некоторые функции могут не работать.
      pinMode(4, OUTPUT);
      if (!SD.begin(4))
      {
        Serial.println("initialization failed!");
        return;
      }
      Serial.println("initialization done.");
    //===============================
    fileReadSlovo = SD.open("TEXT.txt");
      if (fileReadSlovo)
      {
        int i=0;
        while (fileReadSlovo.available())
        {
          char c = fileReadSlovo.read();
            SLOVO[i] = c;
            i++;
            delay(1);
        }
        SLOVO[i]= '\0';
        fileReadSlovo.close();
      }
    //================================
      fileReadGamma = SD.open("GAMMA.txt");
        if (fileReadGamma)
        {
          int i=0;
            while (fileReadGamma.available())
          {
            char c = fileReadGamma.read();
            SLOVO_GAMMA[i] = c;
            i++;
            delay(1);
          }
          SLOVO_GAMMA[i]= '\0';
            fileReadGamma.close();
        }
     
      //========================================
      // Открываем файл для записи. Только один файл
      // может быть открыт одновременно
      // вы можете закрыть файл, что бы открыть другой.
      fileWrite = SD.open("shifr.txt",FILE_WRITE);
      if(fileWrite){
        for (int count_text=0; count_text<strlen(SLOVO); count_text++)
        {
            char b = SLOVO[count_text];
            char g = SLOVO_GAMMA[count_text];
            PEREVOD(b);
            MASSIV[0]=BukvaToKoord[0];
            MASSIV[1]=BukvaToKoord[1];
    //        fileWrite.print(b);
    //        fileWrite.print(":");
            PEREVOD_GAMMA(g);
            MASSIV_GAMMA[0]=BukvaToKoord_GAMMA[0];
            MASSIV_GAMMA[1]=BukvaToKoord_GAMMA[1];
          // POINT_ADD(MASSIV,MASSIV_GAMMA,p);
            long x1,X1, x2,X2, x3, y1, y2, y3, L = 0, L1;
            x1 =X1= MASSIV[0];
            y1 = MASSIV[1];
            x2 =X2= MASSIV_GAMMA[0];
            y2 = MASSIV_GAMMA[1];
            if (MASSIV != MASSIV_GAMMA)
              L = mod(((y2 - y1) * mod_inverse(x2 - x1, p)), p);
            if (MASSIV == MASSIV_GAMMA)
              L = mod((3 * (QuickPow(x1, 2) - 1) * mod_inverse(2 * y1, p)), p);
            L1 = L;
            x3 = mod((QuickPow(L, 2) - X1 - X2), p);
            y3 = mod((L1 *(X1 - x3) - y1), p);
            fileWrite.print(x3);
            fileWrite.print(",");
            fileWrite.print(y3);
            fileWrite.print(";");
        }
          fileWrite.close();
      }
      //=================================================================
      fileReadShifr = SD.open("SHIFR.txt");
        if (fileReadShifr)
        {
          int i=0;
            while (fileReadShifr.available())
          {
            char c = fileReadShifr.read();
            SLOVO_SHIFR[i] = c;
            i++;
       
            delay(1);
          }
    Serial.print(SLOVO_SHIFR[2]);
          SLOVO_SHIFR[i]= '\0';
          fileReadShifr.close();
        }
     
    }

     



    void loop()
    {
        //Тут ничего не происходит
    }
     
  15. filay23

    filay23 Нерд


    Как сделать парсер я разобралась, но не могу считать символы с файла в переменную. Когда пытаюсь вывести символ Serial.print(SLOVO_SHIFR[2]); то происходит зацикливание и печатается белиберда

    Код (Text):
    /*
    * SD карта подключается так:
    ** MOSI - пин 11
    ** MISO - пин 12
    ** CLK - пин 13
    ** CS - пин 4
    */
    #include <iostream>
    #include <stdio.h>
    #include <string>
    #include <limits.h>
    #include <iostream>
    #include <string.h>
    #include <SD.h>

    // Глобальные переменные
    long BukvaToKoord[]={0,0};
    long BukvaToKoord_GAMMA[]={0,0};
    char Point_to_bukva[]="";
    long S[] = { 0,0 };
    long V[] = { 0,0 };
    long W[] = { 0,0 };
    char ALF[]= {' ','!','$','%',
                  '&','(',')','*','+',',','-',
                  '.','/','0','1','2','3','4','5',
                  '6','7','8','9',':',';','?',
                  'A','B','C','D','E',
                  'F','G','H','I','J','K','L',
                  'M','N','O','P','Q','R','S',
                  'T','U','V','W','X','Y','Z',
                  '_','a','b',
                  'c','d','e','f','g','h','i','j',
                  'k','l','m','n','o','p','q','r','s',
                  't','u','v','w','x','y','z','{',
                  '}'
                };
    int ALFAVIT[][2] ={{33,355},{33,396},
                      {34,74},{36,664},{39,580},
                      {43,224},{43,527},{44,366},{44,385},{45,31},{45,720},
                      {47,349},{47,402},{48,49},{48,702},{49,183},{49,568},
                      {53,277},{53,474},{56,332},{56,419},{58,139},{58,612},
                      {59,365},{59,386},{62,379},
                      {66,552},{67,84},{67,667},{69,241},{69,510},
                      {70,195},{70,556},{72,254},{72,497},{73,72},{73,679},
                      {74,170},{74,581},{75,318},{75,433},{78,271},{78,480},
                      {79,111},{79,640},{80,318},{80,433},{82,270},{82,481},
                      {83,373},{83,378},{85,35},{86,25},
                      {93,484},{98,338},{98,413},
                      {99,295},{99,456},{100,364},{100,387},{102,267},{102,484},
                      {105,369},{105,382},{106,24},{106,727},{108,247},{108,504},
                      {109,200},{109,551},{110,129},{110,622},{114,144},{114,607},
                      {115,242},{115,509},{116,92},{116,659},{120,147},{120,604},
                      {125,459},{189,297}};
    // функция mod================================================================
      long mod( long A, long p)
        {
          long B;
            if (A < 0)
                B=(A % p) + p;
            else
                B = A % p;
            return B;
          }
    //===========mod_inverse======================================================
      long mod_inverse(long a, long n)
        {
          long v = 0, i = n, d = 1;
                if (a < 0)
                    a = a + n;
                while (a > 0)
                {
                    long t =  i / a, x = a;
                      a = mod(i , x);
                      i = x;
                      x = d;
                      d = v - t * x;
                      v = x;
                }
                      v %= n;
                  if (v < 0) v = mod((v + n) , n);
                      return v;
          }
    //===================Функция степени==========================================
      long  QuickPow(long x, long y)
          {
            long result = 1;
              while (y > 0)
                {
                  if ((y & 1) == 1)
                      result *= x;
                        x *= x;
                          y >>= 1;
                  }
                  return result;
            }
    //============Функция POINT_ADD===============================================
      long * POINT_ADD(long P[], long Q[], long p)
            {
         
            }
    //======Функция Вычитания==================================================
      long* VUCH(long P[], long Q[], long p)
          {
         
               
            }
    //============Перевод слова в координаты===================================
      long *PEREVOD(char Bukva)
          {
           
          }
    //======Перевод гаммы в координаты=========================================
      long *PEREVOD_GAMMA(char Bukva_GAMMA)
          {
                int i=0;
                  while(Bukva_GAMMA!=ALF[i])
                        {
                          i++;
                        }
                          BukvaToKoord_GAMMA[0]=ALFAVIT[i][0];
                          BukvaToKoord_GAMMA[1]=ALFAVIT[i][1];
          }
    //=======перевод из координат в символ=====================================  
      char* PEREVOD_2(long Point[])
          {
                for (int i=0;i<80;i++)
                {
                  if(Point[0]==ALFAVIT[i][0])
                    {
                        if(Point[1]==ALFAVIT[i][1])
                        {
                          Point_to_bukva[0]=ALF[i];
                        }
                      }
                  }
          }

    File fileWrite;
    File fileReadSlovo;
    File fileReadGamma;
    File fileReadShifr;

    void setup()
    {
      char SLOVO[]="";
      char* bufer;
      char SLOVO_GAMMA[]="";
      char SLOVO_SHIFR[]="";
      char* CIFRA_SHIFR[]={};
      long p=751;
      long MASSIV[]={0,0};
      long MASSIV_GAMMA[]={0,0};
    // Open serial communications and wait for port to open:
      Serial.begin(9600);
      ///  Serial.print("Initializing SD card...");
      // Магия. Этот вывод должен быть настроен как выход.
      // Иначе, некоторые функции могут не работать.
      pinMode(4, OUTPUT);
      if (!SD.begin(4))
      {
        Serial.println("initialization failed!");
        return;
      }
      Serial.println("initialization done.");
    //===============================
    fileReadSlovo = SD.open("TEXT.txt");
      if (fileReadSlovo)
      {
        int i=0;
        while (fileReadSlovo.available())
        {
          char c = fileReadSlovo.read();
            SLOVO[i] = c;
            i++;
            delay(1);
        }
        SLOVO[i]= '\0';
        fileReadSlovo.close();
      }
    //================================
      fileReadGamma = SD.open("GAMMA.txt");
        if (fileReadGamma)
        {
          int i=0;
            while (fileReadGamma.available())
          {
            char c = fileReadGamma.read();
            SLOVO_GAMMA[i] = c;
            i++;
            delay(1);
          }
          SLOVO_GAMMA[i]= '\0';
            fileReadGamma.close();
        }

      //========================================
      // Открываем файл для записи. Только один файл
      // может быть открыт одновременно
      // вы можете закрыть файл, что бы открыть другой.
      fileWrite = SD.open("shifr.txt",FILE_WRITE);
      if(fileWrite){
        for (int count_text=0; count_text<strlen(SLOVO); count_text++)
        {
            char b = SLOVO[count_text];
            char g = SLOVO_GAMMA[count_text];
            PEREVOD(b);
            MASSIV[0]=BukvaToKoord[0];
            MASSIV[1]=BukvaToKoord[1];
    //        fileWrite.print(b);
    //        fileWrite.print(":");
            PEREVOD_GAMMA(g);
            MASSIV_GAMMA[0]=BukvaToKoord_GAMMA[0];
            MASSIV_GAMMA[1]=BukvaToKoord_GAMMA[1];
          // POINT_ADD(MASSIV,MASSIV_GAMMA,p);
            long x1,X1, x2,X2, x3, y1, y2, y3, L = 0, L1;
            x1 =X1= MASSIV[0];
            y1 = MASSIV[1];
            x2 =X2= MASSIV_GAMMA[0];
            y2 = MASSIV_GAMMA[1];
            if (MASSIV != MASSIV_GAMMA)
              L = mod(((y2 - y1) * mod_inverse(x2 - x1, p)), p);
            if (MASSIV == MASSIV_GAMMA)
              L = mod((3 * (QuickPow(x1, 2) - 1) * mod_inverse(2 * y1, p)), p);
            L1 = L;
            x3 = mod((QuickPow(L, 2) - X1 - X2), p);
            y3 = mod((L1 *(X1 - x3) - y1), p);
            fileWrite.print(x3);
            fileWrite.print(",");
            fileWrite.print(y3);
            fileWrite.print(";");
        }
          fileWrite.close();
      }
      //=================================================================
      fileReadShifr = SD.open("SHIFR.txt");
        if (fileReadShifr)
        {
          int i=0;
            while (fileReadShifr.available())
          {
            char c = fileReadShifr.read();
            SLOVO_SHIFR[i] = c;
            i++;
       
            delay(1);
          }
    Serial.print(SLOVO_SHIFR[2]);
          SLOVO_SHIFR[i]= '\0';
          fileReadShifr.close();
        }




    }





    void loop()
    {
        //Тут ничего не происходит
    }
     
  16. dnk

    dnk Нерд

    Знаете в чем основное отличие массива, от других структур данных? У него размер является константой. Соответственно

    Код (Text):

    char SLOVO_SHIFR[] = "";
     
    является массивом размером в 1 символ

    Код (Text):

    // все С-строки содержат в себе завершающий '\0'
    char SLOVO_SHIFR[] = { '\0' };
     
    В этом легко можно убедиться:

    Код (Text):

    // делим размер массива в байтах на размер его первого элемента в байтах
    // получаем размер массива в элементах, т.е. в данном случае в символах
    Serial.println(sizeof(SLOVO_SHIFR) / sizeof(SLOVO_SHIFR[0]);
     
    В Вашем коде

    Код (Text):

    int i=0;
            while (fileReadShifr.available())
          {
            char c = fileReadShifr.read();
            SLOVO_SHIFR[i] = c;
            i++;

            delay(1);
          }
     
    с большой вероятностью происходит запись данных за пределы массива, сначала Вы перезаписываете '\0', т.е. конец строки, а дальше уже пишете в память, которая не принадлежит массиву. Что, в свою очередь, может стать источником различных неопределенных эффектов.

    В качестве простого решения могу предложить объявление массива с фиксированным размером, достаточным, чтобы вмещать в себя слово, например:

    Код (Text):

    // массив из 32 символов, может вмещать строку до 31 символа + завершающий '\0'
    const size_t MAX_SHIFR_LEN = 32;
    char SLOVO_SHIFR[MAX_SHIFR_LEN];
    // инициализируем весь массив нулями
    memset(SLOVO_SHIFR, 0, MAX_SHIFR_LEN);
     
    Размер массива (MAX_SHIFR_LEN) в Вашем случае зависит от данных, которые Вы читаете.
     
    Последнее редактирование: 3 май 2015
  17. filay23

    filay23 Нерд

    Спасибо большое за совет!
    как можно из массива char перевести в long 2х мерный??
     
  18. filay23

    filay23 Нерд

    как можно из массива char (в котором хранится следующая информация 786,898; 896,453;786,898; 896,453)перевести в long 2х мерный??