Проблема с выводом на экран

Тема в разделе "Arduino & Shields", создана пользователем Ми4а, 24 сен 2016.

  1. Ми4а

    Ми4а Нуб

    Здравствуйте.
    Бьюсь над проблемой уже который день. Нужна Ваша помощь. А суть проблемы такова. Имеется экран на который надо вывести содержимое текстового файла, который лежит на 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"

    Вторая сложность, что русский текст из фаила не отображается.

    Подскажите, пожалуйста, как решить эти проблемы. В благодарность пополню телефон.
     
    Последнее редактирование: 24 сен 2016
  2. AlexU

    AlexU Гуру

    А может на экран выводится 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), то нужно знать что за дисплей Вы используете.
     
  3. Ми4а

    Ми4а Нуб

    Да, Вы совершенно правы. С 2мя точками.
    Использую этот http://amperka.ru/product/text-lcd-20x4 дисплей.
    Спасибо за наводки. Завтра попробую поиграться с кодировками. Если поможет, отблагодарю, как и обещал. Ну или в крайнем случае опишу, что произошло после внесения правок.
     
  4. Ми4а

    Ми4а Нуб

    Изменил кодировку, русский язык появился. Спасибо.
    Но осталась проблема с переносом строки. Правка myFile.readStringUntil('\n') на myFile.readStringUntil('\r') убрала i в конце строки, но добавила y с тремя точками на последующих строках.
    Код (C++):
    Первая строка
    yВторая строка
    уТретья строка
    Вариант с myFile.readStringUntil('\r\n') видимых изменений не принес.
     
  5. AlexU

    AlexU Гуру

     
    ostrov нравится это.
  6. Ми4а

    Ми4а Нуб

    Подскажите, как его пропускать?
     
  7. AlexU

    AlexU Гуру

    Можно грубо:
    Код (C++):
    buffer = myFile.readStringUntil('\n');
    buffer.trim();  // удаление пробельных символов в начале и конце строки
    Serial.println(buffer);
    В данном случае вместе с ненужными символами '\r' или '\n' будут так же удалены и символы пробела, табуляции и т.п.
    А если делать по честному, то алгоритм перебора символов строки с выкидыванием лишних не такой уж сложный. И думаю разработка такого алгоритма и его реализации должна быть Вам по силам.
     
    Ми4а нравится это.
  8. Ми4а

    Ми4а Нуб

    Спасибо, опробую в ближайшее время. Отправьте свой номер телефона в ЛС, пополню.
     
  9. Ми4а

    Ми4а Нуб

    Возникла такая сложность
    При реализации вывода lcd.print(buffer); не выводятся спецсимволы например знак "c", который вполне себе корректно отображается при lcd.print("\x19");

    Вместо "c" выводится фx19 или что то в этом духе
     
  10. AlexU

    AlexU Гуру

    Потому что функция 'print' выводит данные в том виде, в котором ей передали. В случае с вызовом lcd.print("\x19") компилятор позаботиться о том, что бы символ '\x19' был передан в функцию в "правильном" виде (т.е. во время компиляции будет преобразован в число 0x19)..