Здравствуйте. Бьюсь над проблемой уже который день. Нужна Ваша помощь. А суть проблемы такова. Имеется экран на который надо вывести содержимое текстового файла, который лежит на sd карте. Код (C++): #include <LiquidCrystalRus.h> #include <SPI.h> #include <SD.h> #define backlight_Pin 5 File myFile; LiquidCrystalRus lcd(11, 10, 9, 8, 7, 6); void setup() { pinMode(backlight_Pin, OUTPUT); lcd.begin(20, 4); String buffer; digitalWrite(backlight_Pin, HIGH); byte y = 0; Serial.begin(9600); pinMode(53, OUTPUT); if (!SD.begin(53)) { Serial.println("initialization failed!"); return; } myFile = SD.open("0000.txt"); if (myFile) { Serial.println("0000.txt:"); // считываем все данные из файла: while (myFile.available()) { buffer = myFile.readStringUntil('\n'); Serial.println(buffer); lcd.print(buffer); y++; lcd.setCursor(0, y); } // закрываем файл: myFile.close(); lcd.display(); } else { // если файл не открылся, отображаем сообщение об ошибке: Serial.println("error opening test.txt"); } } void loop() { // после setup ничего не происходит } Столкнулся с двумя сложностями. На экран выводится символ конца строки из фаила 0000.txt. Что выглядит примерно как Test texti Теst texti Т.е. на экран передается '\n', который отображается, как "i" Вторая сложность, что русский текст из фаила не отображается. Подскажите, пожалуйста, как решить эти проблемы. В благодарность пополню телефон.
А может на экран выводится i с двумя точками вверху? Если так, то это символ '\r' (из пары '\r\n' == 0xD 0xA -- окончание строки в Windows). Сканирование строки (readStringUntil) нужно делать до символа или '\r', или '\n'. А потом нужно смотреть следующий символ, если он либо '\r', либо '\n', то этот символ нужно пропускать. Этот способ гарантирует пропуск разделителя строк во всех системах -- Unix/Linux = '\n', Windows = '\r\n', MacOS (по крайней мере в старых версиях) = '\r'. Если текст в файлах храниться в кодировке UTF-8, то: https://github.com/RoboCraft/LiquidCrystalRus. Если в CP-1251 (Windows), то нужно знать что за дисплей Вы используете.
Да, Вы совершенно правы. С 2мя точками. Использую этот http://amperka.ru/product/text-lcd-20x4 дисплей. Спасибо за наводки. Завтра попробую поиграться с кодировками. Если поможет, отблагодарю, как и обещал. Ну или в крайнем случае опишу, что произошло после внесения правок.
Изменил кодировку, русский язык появился. Спасибо. Но осталась проблема с переносом строки. Правка myFile.readStringUntil('\n') на myFile.readStringUntil('\r') убрала i в конце строки, но добавила y с тремя точками на последующих строках. Код (C++): Первая строка yВторая строка уТретья строка Вариант с myFile.readStringUntil('\r\n') видимых изменений не принес.
Можно грубо: Код (C++): buffer = myFile.readStringUntil('\n'); buffer.trim(); // удаление пробельных символов в начале и конце строки Serial.println(buffer); В данном случае вместе с ненужными символами '\r' или '\n' будут так же удалены и символы пробела, табуляции и т.п. А если делать по честному, то алгоритм перебора символов строки с выкидыванием лишних не такой уж сложный. И думаю разработка такого алгоритма и его реализации должна быть Вам по силам.
Возникла такая сложность При реализации вывода lcd.print(buffer); не выводятся спецсимволы например знак "c", который вполне себе корректно отображается при lcd.print("\x19"); Вместо "c" выводится фx19 или что то в этом духе
Потому что функция 'print' выводит данные в том виде, в котором ей передали. В случае с вызовом lcd.print("\x19") компилятор позаботиться о том, что бы символ '\x19' был передан в функцию в "правильном" виде (т.е. во время компиляции будет преобразован в число 0x19)..