Считывание из файла

Тема в разделе "Arduino & Shields", создана пользователем SnJon, 3 июл 2015.

  1. SnJon

    SnJon Нерд

    Доброго всем времени суток. Нужна помощь в программировании =) В общем имеется на SD карточке txt файл следующего содержания.
    Код (Text):
    70 46 111 77 79
    71 46 111 74 79
    70 46 111 71 79
    70 46 111 67 79
    70 46 110 64 79
    70 46 110 61 79
    70 46 109 59 79
    70 46 109 59 81
    70 46 109 59 84
    70 46 109 60 86
    70 46 109 63 89
    70 46 109 66 90
    70 46 109 69 90
    70 46 109 72 89
    70 46 109 76 89
    70 46 109 80 89
    70 46 109 83 89
    70 46 109 86 89
    70 47 110 88 89
    70 46 110 89 88
    70 46 110 88 87
    70 46 110 88 85
     
    Это сохраненные углы 5-ти сервоприводов. Требуется считывать эти углы и поочередно записывать не занося их все сразу в ОЗУ ардуино. Т.е. прочитали первый угол (70), записали в 1-ю серво, прочитали второй угол (46), записали во 2-ю серво и т.д. Для реализации данной идеи предполагается использовать функции стандартной библиотеки "SD.h". А точнее:
    • file.seek(pos) - функция изменения положения текущей позиции внутри файла
    • file.peek() - функция считывания из файла байта данных, не перемещая указатель текущей позиции файла на следующий символ
    • file.position() - функция, позволяющая узнать текущее положение указателя внутри открытого файла
    Напрашивается такой алгоритм:
    1. считываем байт данных
    2. в цикле от 0 до размера файла проверяем, не равен ли полученный символ пробелу: если не равен, заносим в...(вот тут непонятно, каким образом можно накапливать значения например в одной переменной типа int; массив в данном случае не годится), иначе записываем значение сервопривод и изменяем положение текущей позиции внутри файла на 1.
    Примерный код:

    Код (Text):

    char test; //символьная переменная для считывания байта данных
    char string[2]; // предполагаемый массив сток, для хранения одного угла

    SD.begin(53);
    myFile = SD.open("1.txt", FILE_READ);
    k_symbol =  myFile.size();
       
         for (int i=0; i<k_symbol; i++)
            {
            myFile.seek(i);
            test = myFile.peek();
            if (test != ' ')
            {
                for (int i=0; i<2; i++)
                {
                string[i]=myFile.peek;
                }
            }
            else      
                {
                pos = myFile.position();
                myFile.seek(pos+1);
                }
            }      
    myFile.close();
       
    Не совсем понимаю, как можно занести один угол в значение int, чтобы потом передать на запись в сервопривод. Помогите пожалуйста
     
  2. Unixon

    Unixon Оракул Модератор

    Код (Text):

    #define N_SERVO 5
    int PIN_SERVO[N_SERVO] = {2,3,4,5,6};
    Servo servo[N_SERVO];

    for (int i = 0; i < N_SERVO; i++)
    {
      servo[i].attach(PIN_SERVO[i]));
    }

    data = SD.open("1.txt", FILE_READ);
    while (data.available())
    {
      for (int i = 0; i < N_SERVO; i++)
      {
       servo[i].write(data.parseInt(' '));
      }
    }
    data.close();
     
     
    SnJon нравится это.
  3. SnJon

    SnJon Нерд

    Ругается на строчку:
    Код (Text):
    servo[i].write(data.parseInt(' '));
    Сообщение об ошибке:
    Код (Text):
    Arduino: 1.6.5 (Windows 7), Плата"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

    In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h:29:0,
                    from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:224,
                    from C:\Program Files (x86)\Arduino\libraries\SD\src/SD.h:18,
                    from sketch_jul03a.ino:4:
    C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h: In function 'States onRun()':
    C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h:97:8: error: 'long int Stream::parseInt(char)' is protected
      long parseInt(char skipChar); // as above but the given skipChar is ignored
            ^
    sketch_jul03a:226: error: within this context
    within this context
     
     
  4. Unixon

    Unixon Оракул Модератор

    А, да, проглядел. Замените на parseInt() без параметра.
     
    SnJon нравится это.
  5. SnJon

    SnJon Нерд

    Спасибо большое, все работает