Чтение текстового файла из sd карты

Тема в разделе "Arduino & Shields", создана пользователем Logger, 14 июн 2025 в 18:36.

  1. Logger

    Logger Нерд

    Добрый день!
    Не могу уяснить логику процесса считывания с SD карты.
    Прошу проверить мои рассуждения и указать на ошибку.

    На карте записан текстовый файл, каждая строка которого состоит из цифры и точки с запятой как символ конца строки. Например – читаем строку текстового файла, которая на экране компа выглядит так: 3;
    Использую код (проверка карты и установки опущены):
    Код (C++):

    int index = 0;
    char stringArray[1]; //переменная в 1 байт – строчный Массив, длиной в один символ
    File myFile;
    int next = 0;
    int data = 0;

    void loop() {                                           //шаги скетча:
    [INDENT]while ((next = myFile.read()) != -1) {  // 1.
        char nextChar = (char) next;           // 2.
        if (nextChar == '\n') {                        // 3.
            stringArray[index] = '\0';              // 4.
            data = myFile.read();                   // 5.                
            a=data-48;                                     // 6.                      
        }
        else {                                                  // 7.                        
        stringArray[index] = nextChar;       // 8.
        index += 1;                                        // 9.            
        }
    }[/INDENT]
    }
     
    Скетч работает нормально - читает построчно текстовый файл с SD карты и производит нужное действие, используя полученный символ как переменную.
    На SD карте, в этой строке, как я понял, записаны два символа – ‘51’ и ‘59’
    шаги скетча:
    1. Переменная next на этом шаге принимает значение myFile.read(), то есть значение сейчас считываемого символа с карты. И пока переменная next не окажется ПУСТОЙ (то есть пока не будет считано из строки «отсутствие любого символа» на третьей позиции, после ‘51’ и ‘59’), будет выполняться цикл. Считан символ ‘51’, поэтому цикл продолжается.

    2. Объявляемая здесь, в цикле loop, переменная nextChar, имеющая тип char, принимает значение переменной next, имеющей тип Int, но значение переменной конвертируется из Int в char.
    То есть nextChar = 51

    3. Если значение переменной nextChar соответствует символу конца строки, что одно и то же с символом «перевода каретки» и с символом «начало новой строки», то есть, в данном случае – если соответствует точке с запятой, то выполняем 4. 5. 6.
    Значение не соответствует концу строки – переходим на else

    8. Первое значение массива, под индексом 0, становится равным nextChar:
    stringArray[0] = 51;
    9. Индекс увеличивается на 1 и становится равным 1

    1. Переменная next принимает значение ‘59’, цикл продолжается.

    2. Переменная nextChar принимает значение 59

    3. nextChar соответствует условию «конец строки, перевод каретки», выполняем «если»

    4. переменная stringArray[1] принимает пустое значение, таким образом, в результате, строчный массив состоит из одного значения под индексом 0, равным 51

    5. переменная data принимает текущее значение myFile.read(), равное ‘59’

    6. переменная a должна бы показать 11, но показывает верное значение- 3.

    Не могу понять почему, в результате выполнение скетча, переменная data оказывается равной предыдущему значению myFile.read() ???
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Если хотите, чтобы кто-то серьёзно поработал с Вашей проблемой, вставьте ПОЛНЫЙ код. Чтобы можно было просто скопипастить его и запустить безо всяких лишних телодвижений.

    Если сделаете, то я постараюсь посмотреть что там у Вас.
     
  3. parovoZZ

    parovoZZ Гуру

    видимо, в конце последней строки отсутствует символ переноса '\n'
     
  4. Logger

    Logger Нерд

    Здравствуйте, Asper Daffy,
    Загрузил файл, который работает, делает то, что нужно - рисует на экране рисунки, закодированные в текстовых файлах на SD карте.
    Вопрос в том, что мне требуется ликбез по считыванию информации с SD карты - оно-то работает и сделал его я, а вот как оно работает - не до конца понятно :)
    Спасибо, что откликнулись!
     

    Вложения:

    • Podpis9.ino
      Размер файла:
      6 КБ
      Просмотров:
      4
  5. Logger

    Logger Нерд

    Кстати. Заметил, что при исполнении скетча, теряется самый первый символ, то есть первая строка текстового файла.
    В многоточечном рисунке это значения не имеет, но почему так происходит - тоже неясно.
     
  6. Asper Daffy

    Asper Daffy Иксперд

    У Вас тут четыре файла: "ramka25.txt", "podpis1.txt", "podpis20.txt", "podpis25.txt" и четыре кнопки. Они все нужны для демонстрации проблемы? Никак нельзя одним файлом обойтись и одной кнопкой или вовсе без кнопок?

    В любом случае мне надо видеть файл (файлы), чтобы не гадать что в них сложено, так что его (их) тоже выкладывайте.
     
  7. Logger

    Logger Нерд

    Из скетча лишнее убрал. Оставил одну кнопку и один рисунок.
    Залил в прибор, проверил - работает как требуется.
    Текстовый файл выложил.
    Схему прибора выложил. Микросхема от шариковой мыши, название не знаю.
    О том, что некоторые Ардуино могут работать как мышь, знаю, но когда делал прибор - не знал.
    Поэтому заказал-купил оптическую и использовал её микросхему для связи с компом.
    Опять же - спасибо Вам, что разбираетесь во всей этой мешанине!
     
  8. Logger

    Logger Нерд

    Файлы
     

    Вложения:

  9. Asper Daffy

    Asper Daffy Иксперд

    Простите, не понял. Проблема разрешилась? Или "как требуется" - это как раз "демонстрирует проблему"?

    Если второе, то могу сегодня вечером плотно поковыряться. Скажите, чтобы мне зря этого не делать.
     
  10. Logger

    Logger Нерд

    Добрый вечер, Asper Daffy,
    Я, вероятно, плохо объяснил в чём проблема.
    Да, всё работает, может быть криво, но не в этом суть вопроса.
    Я, в самом первом посте, просил кого-нибудь о помощи в объяснении мне ТЕОРИИ общения карты SD с ардуино.
    Или на примере моего скетча, или любого, какой Вам удобнее, только пошагово.
    Дело в том, что я, перекопав, сколько силы воли хватило, учебников и рекомендаций в инете, не могу понять как именно происходит процесс считывания с SD. Везде пишут в манере "сделайте вот так и всё получится", без разбора работы кода.

    Исходно: на карте SD есть текстовый файл со строками известной длины, состоящей из цифр. Нужно считывать их в переменные и после каждой строки выполнять с этими переменными часть кода. Строку сейчас использую длиной в одну цифру + точка с запятой (тоже непонятно, кстати, зачем этот знак). Но вот, допустим, как перейти на большее количество знаков в строке - непонятно.

    Даже если порекомендуете какую-либо хорошую литературу - уже буду рад. А если дадите пояснения к коду - вообще здорово!
    Стоит ли Вам, для этого, тратить время на проверку моего кода - мне трудно судить. Может просто вопрос-ответ?
     
  11. parovoZZ

    parovoZZ Гуру

    Так а нет никакой теории. Надо просто открыть исходники используемой библиотеки и посмотреть, что там происходит. Самое верное - найти на гитхабе. Там же наверняка есть и пояснения к свойствам и методам класса.
     
  12. Asper Daffy

    Asper Daffy Иксперд

    Так, понятно. У Вас все смешано в кучу, так Вам очень трудно. Давайте попробуем отделить мух от котлет.

    Разбор строки (количество символов, разделители и т.п.) не имеет никакого отношения (от слова "совсемникакого") к CD-карте. Равно как и наоборот, чтение карты не имеет никакого отношения к тому, что именно читается, сколько там символов и что они означают.

    Это две разные задачи:
    1. прочитать байты из файла и просто выдать их в виде последовательности, один за одним. Это можно пробовать и учиться на файлах в которых просто что-то есть и смотреть правильно ли это что-то выводится в виде последовательности символов;
    2. разобрать строку по разделителям или ещё как. Это можно пробовать безо всякой карты, просто загнав "якобы содержимое файла" в строковую переменную и мучить эту переменную разбором.
    Если Вы научитесь делать эти две задачи по отдельности, Вам не составит никакого труда прочитать с карты (т.е. выполнить первую задачу) и разобрать прочитанное (т.е. выполнить вторую задачу.

    Это реально две разные задачи, потому Вы и в сети не можете найти. Поищите по отдельности - чтение с карты и разбор строки (неважно откуда взявшейся), всё найдётся.
     
    Logger и DetSimen нравится это.
  13. Logger

    Logger Нерд

    исходники используемой библиотеки и посмотреть, что там происходит. Самое верное - найти на гитхабе. Там же наверняка есть и пояснения к свойствам и методам класса.[/QUOTE]

    Добрый день, parovoZZ, спасибо!
     
  14. Logger

    Logger Нерд

    Здравствуйте, Asper Daffy,

    Да, задачу под №1 я уже начал решать - вывожу после каждого шага кода значения в serial, проясняется.
    По задаче №2 - тоже понятно, прочёл простую и понятную статью про массивы - буду пробовать.
    Спасибо Вам!