Добрый день! Не могу уяснить логику процесса считывания с 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() ???
Если хотите, чтобы кто-то серьёзно поработал с Вашей проблемой, вставьте ПОЛНЫЙ код. Чтобы можно было просто скопипастить его и запустить безо всяких лишних телодвижений. Если сделаете, то я постараюсь посмотреть что там у Вас.
Здравствуйте, Asper Daffy, Загрузил файл, который работает, делает то, что нужно - рисует на экране рисунки, закодированные в текстовых файлах на SD карте. Вопрос в том, что мне требуется ликбез по считыванию информации с SD карты - оно-то работает и сделал его я, а вот как оно работает - не до конца понятно Спасибо, что откликнулись!
Кстати. Заметил, что при исполнении скетча, теряется самый первый символ, то есть первая строка текстового файла. В многоточечном рисунке это значения не имеет, но почему так происходит - тоже неясно.
У Вас тут четыре файла: "ramka25.txt", "podpis1.txt", "podpis20.txt", "podpis25.txt" и четыре кнопки. Они все нужны для демонстрации проблемы? Никак нельзя одним файлом обойтись и одной кнопкой или вовсе без кнопок? В любом случае мне надо видеть файл (файлы), чтобы не гадать что в них сложено, так что его (их) тоже выкладывайте.
Из скетча лишнее убрал. Оставил одну кнопку и один рисунок. Залил в прибор, проверил - работает как требуется. Текстовый файл выложил. Схему прибора выложил. Микросхема от шариковой мыши, название не знаю. О том, что некоторые Ардуино могут работать как мышь, знаю, но когда делал прибор - не знал. Поэтому заказал-купил оптическую и использовал её микросхему для связи с компом. Опять же - спасибо Вам, что разбираетесь во всей этой мешанине!
Простите, не понял. Проблема разрешилась? Или "как требуется" - это как раз "демонстрирует проблему"? Если второе, то могу сегодня вечером плотно поковыряться. Скажите, чтобы мне зря этого не делать.
Добрый вечер, Asper Daffy, Я, вероятно, плохо объяснил в чём проблема. Да, всё работает, может быть криво, но не в этом суть вопроса. Я, в самом первом посте, просил кого-нибудь о помощи в объяснении мне ТЕОРИИ общения карты SD с ардуино. Или на примере моего скетча, или любого, какой Вам удобнее, только пошагово. Дело в том, что я, перекопав, сколько силы воли хватило, учебников и рекомендаций в инете, не могу понять как именно происходит процесс считывания с SD. Везде пишут в манере "сделайте вот так и всё получится", без разбора работы кода. Исходно: на карте SD есть текстовый файл со строками известной длины, состоящей из цифр. Нужно считывать их в переменные и после каждой строки выполнять с этими переменными часть кода. Строку сейчас использую длиной в одну цифру + точка с запятой (тоже непонятно, кстати, зачем этот знак). Но вот, допустим, как перейти на большее количество знаков в строке - непонятно. Даже если порекомендуете какую-либо хорошую литературу - уже буду рад. А если дадите пояснения к коду - вообще здорово! Стоит ли Вам, для этого, тратить время на проверку моего кода - мне трудно судить. Может просто вопрос-ответ?
Так а нет никакой теории. Надо просто открыть исходники используемой библиотеки и посмотреть, что там происходит. Самое верное - найти на гитхабе. Там же наверняка есть и пояснения к свойствам и методам класса.
Так, понятно. У Вас все смешано в кучу, так Вам очень трудно. Давайте попробуем отделить мух от котлет. Разбор строки (количество символов, разделители и т.п.) не имеет никакого отношения (от слова "совсемникакого") к CD-карте. Равно как и наоборот, чтение карты не имеет никакого отношения к тому, что именно читается, сколько там символов и что они означают. Это две разные задачи: прочитать байты из файла и просто выдать их в виде последовательности, один за одним. Это можно пробовать и учиться на файлах в которых просто что-то есть и смотреть правильно ли это что-то выводится в виде последовательности символов; разобрать строку по разделителям или ещё как. Это можно пробовать безо всякой карты, просто загнав "якобы содержимое файла" в строковую переменную и мучить эту переменную разбором. Если Вы научитесь делать эти две задачи по отдельности, Вам не составит никакого труда прочитать с карты (т.е. выполнить первую задачу) и разобрать прочитанное (т.е. выполнить вторую задачу. Это реально две разные задачи, потому Вы и в сети не можете найти. Поищите по отдельности - чтение с карты и разбор строки (неважно откуда взявшейся), всё найдётся.
исходники используемой библиотеки и посмотреть, что там происходит. Самое верное - найти на гитхабе. Там же наверняка есть и пояснения к свойствам и методам класса.[/QUOTE] Добрый день, parovoZZ, спасибо!
Здравствуйте, Asper Daffy, Да, задачу под №1 я уже начал решать - вывожу после каждого шага кода значения в serial, проясняется. По задаче №2 - тоже понятно, прочёл простую и понятную статью про массивы - буду пробовать. Спасибо Вам!