Здравствуйте форумчане Столкнулся с такой вот проблемой : Мне нужно вывести на экран (у меня old 0.91) некую информацию (к примеру: "Привет мир"), записанную на sd карту. Ну вот, купил я значит все комплектующие, всё подключил, написал скетч, но ничего не получилось, в скетчи для вывода на экран использовал переменную типа char, но символы на экран выводятся по одному, с масивом ничего не получается(т.к его нельзя перезаписать). Пробовал использовать String, но экран выводит не буквы, а цифры(почему ?- незнаю ). Прошу помощи ! Скетч (если нужен ) выложу чуть позже
Код (C++): #define CS_PIN 4 #include <SPI.h> #include <SD.h> #include "U8glib.h" U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); File myFile; char symbol ; void setup() { Serial.begin(9600); while (!Serial) { } if (!SD.begin(CS_PIN)) { Serial.println("Что-то пошло не так"); while (true) { } } } void loop() { myFile = SD.open("file.txt", FILE_READ); if (myFile) { while (myFile.available()) { symbol = myFile.read(); Serial.print(symbol); u8g.firstPage(); do { draw(); } while ( u8g.nextPage() ); delay(500); } myFile.close(); } else { Serial.println("Не удалось открыть файл"); } } void draw(void) { u8g.setFont(rus9x15); u8g.setPrintPos(10, 20); u8g.print(symbol); } Ответы нужны )
и в чем вопрос? Читаете с карты по одному символу, выводите на экран тоже по одному - как написано. так и работает
Если не нравится, что на экран текст выводится долго, то имеет смысл сначала заполнять буферный массив, а потом его вывести на экран. Также стоит учесть, что символы могут иметь кодировку отличную от ASCII и не поместятся в один байт char.
Буфер - область памяти для хранения временной информации. Условно я предложил (идея @Un_ka) вот что: Код (C++): char buffer[100500];//100500 - эл-тов, т.к. неизвестно сколько максимально нужно. Это число нужно выбрать с умом. Число эл-тов должно быть >= числа букв в самом длинном млове и как можно меньшим, чтобы не занимало кучу памяти. Char tmpSymbol;//временная переменная для текущего символа char i;//кол-во считанных символов ... Void Процедура вывода одного слова на экран() { tmpSymbol=считать символ с карточки i=0; while (tmpSymbol!=знак препинания) { buffer[i]=tmpSymbol; i++; tmpSymbol=считать символ с карточки } если i>0 тогда { вывести на экран i элементов массива buffer } } На С писать не буду
Код (C++): #define CS_PIN 4 #include <SPI.h> #include <SD.h> #include "U8glib.h" U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); File myFile; char bufer[100]; char symbol ; int i; void setup() { Serial.begin(9600); while (!Serial) { } if (!SD.begin(CS_PIN)) { Serial.println("Что-то пошло не так"); while (true) { } } } void loop() { myFile = SD.open("file.txt", FILE_READ); if (myFile) { while (myFile.available()) { enter(); myFile.close(); } } else { Serial.println("Не удалось открыть файл"); } } void enter() { symbol = myFile.read(); i = 0; while (symbol != ';') { bufer[i] = symbol; i++; symbol = myFile.read(); } if (i > 0) { Serial.print(bufer[i]); u8g.firstPage(); do { draw(); } while ( u8g.nextPage() ); } } void draw(void) { u8g.setFont(rus9x15); u8g.setPrintPos(10, 20); u8g.print(bufer[i]); } написал я код по вашему примеру, но на экран и в последовательный порт ничего не выводится. В чем может быть моя ошибка ?
в том что вы выводите в Сериал и на экран зачем-то Код (C++): buffer[i] вместо нужной строки . попробуйте выполнить свой код так, как будто вы - контроллер. может тогда придет понимание, что в ячейке i массива buffer ничего нет
u8g.print подобен serial print. Код (C++): while (symbol != ';') { bufer[i] = symbol; i++; symbol = myFile.read(); } когда i станет больше 99 он перезапишет всю память пока не упрётся в стёк и сам себя не остановит, короче должно быть так: Код (C++): while (symbol != ';' and i<100) { bufer[i] = symbol; i++; symbol = myFile.read(); } Попробуйте u8g.print(String(bufer));