Nextion и SD карта

Тема в разделе "Arduino & Shields", создана пользователем АлексейНик, 2 июл 2019.

  1. Всем привет! Ну никак не получается настроить корректный вывод данных с SD карты на дисплей Nextion. Не могу найти информацию о том, какими функциями пользоваться... Вынужден просить помощь...

    Задача такая: записанные в файле "TEST.TXT" текст и числа вывести на дисплей. Начинал с чисел. Выводил как n0.val, но результат один и тот же - приходят данные в числовом формате. Если читаю из файла "TEKST", то приходит на дисплей "84", в мониторе выходит t1.txt="84"⸮⸮⸮ .

    Вот мой скетч, собранный кое-как. Буду рад любым подсказкам!

    Код (C++):
    #include <SoftwareSerial.h>
    #include <SPI.h>
    #include <SD.h>

    File myFile;

    void setup() {
      // Open serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB port only
      }


    if (!SD.begin(4)) {
        Serial.println("initialization failed!");
        while (1);
    }

      // re-open the file for reading:
      myFile = SD.open("test.txt");

    Serial.print("t1.txt=");

    Serial.print("\"");  // Since we are sending text we need to send double quotes before and after the actual text.

    Serial.print(myFile.read());

    Serial.print("\"");  // Since we are sending text we need to send double quotes before and after the actual text.

    Serial.write(0xff);
    Serial.write(0xff);
    Serial.write(0xff);
         
        // close the file:
        myFile.close();
       
    }

     
    void loop() {  // Put your main code here, to run repeatedly:

     
    }
     
  2. b707

    b707 Гуру

    а так
    Serial.print((char)myFile.read());
     
  3. Приветствую b707! Записано 123, приходит 1.
    Прописано TEST , в монитор приходит t1.txt="T"⸮⸮⸮ . На дисплей не приходит ничего.
     
    Последнее редактирование: 2 июл 2019
  4. b707

    b707 Гуру

    ну значит мой метод работает, вместо цифр уже буквы. Продолжайте
    А должно? что-то про дисплей я у вас в скетче ни строчки не вижу
     
  5. Belkin

    Belkin Гик

    А что надо написать ? ;)
    Nextion с внешним миром общается через UART и никаких конкретных упоминаний о себе не просит. ;)

    АлексейНик - вы тут листали ?
    http://forum.amperka.ru/threads/Дисплей-nextion-азы-arduino-esp8266.9204/
     
  6. Приветствую, Belkin! Я видел эту статью. Тогда не понял как ее применить к своей задаче, но сейчас новые мысли возникли. Уж больно замужрено сделано, например вот эта часть:

    lt =false-- прием сообщения
    str =""
    count =0

    uart.on("data",1,-- работаем с каждым пришедшим байтом
    function(dt)-- dt - это есть каждый новый байт
    if lt then-- прием разрешен
    if dt =="\255"then-- сравниваем с 0xff и считаем их до трех
    count = count +1
    if count ==3then-- досчитали
    count =0-- сбросили счетчик
    pub(str)-- публикуем
    str =""-- очистили глобальную
    lt =false-- конец приема
    end
    else
    str = str..dt -- идет прием - формируем стринг
    -- если что-то идет криво и набралось много буков
    -- убиваем все и начинаем заново
    if#str >20then str =""; count =0end
    end
    end

    -- вначале у нас пустой стринг и \112 на входе:
    -- начинаем прием
    if str ==""and dt =="\112"then
    lt =true
    end
    end,0)

    Но я ее еще проанализирую обязательно. Что однозначно, так то, что я могу отправить и текст и цифры на дисплей через Serial.print. Так все работает. Могу считать данные с карты и отправить в монитор порта, все четко. Но если читаю данные с карты и отправляю их на дисплей, то идет искажение данных. Как будто проблема с кодированием данных. Или они приходят несистемно, образуя кашу. Иногда показывало -1. Карта отформатирована в FAT32. Это может влиять? Вот вопрос: как надо конвертировать считанные с карты данные перед отправкой на дисплей?
     
    Последнее редактирование: 2 июл 2019
    Belkin нравится это.
  7. Belkin

    Belkin Гик

    Разделите свою задачу на две:
    1. Чтение данных с SD-карты
    2. Передача данных в Nextion

    Если "1" решите (или уже решено) полноценно, то остается только сформировать правильную строку для передачи.
    Для решения "2" еще раз внимательно перелистайте указанное ранее.
    Там есть ответы, поверьте. ;)
     
    АлексейНик нравится это.
  8. Спасибо, буду переосмыслять!
     
  9. Belkin, Help me please! Не понимаю... Прочита много чего про String, получается передать текст из кода, но не прочитанный с флешки. Неужели нельзя одной командой конвертировать весь считанный текст и отправить в Serial ? Неужели нужно считывать каждый символ? Вот мой код, который корректно выводит только первую букву из строки:
    Код (C++):
    #include <SoftwareSerial.h>
    #include <SPI.h>
    #include <SD.h>

    File myFile;


    void setup() {
      // Open serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB port only
      }


    if (!SD.begin(4)) {
        Serial.println("initialization failed!");
        while (1);
    }

      // re-open the file for reading:
      myFile = SD.open("test.txt");


    Serial.print("t1.txt=");

    Serial.print("\"");  // Since we are sending text we need to send double quotes before and after the actual text.

    Serial.print((char)myFile.read());

    Serial.print("\"");  // Since we are sending text we need to send double quotes before and after the actual text.

    Serial.write(0xff);
    Serial.write(0xff);
    Serial.write(0xff);
         
        // close the file:
        myFile.close();
       
    }

     
    void loop() {  // Put your main code here, to run repeatedly:

     
    }
     
  10. b707

    b707 Гуру

    так что вы возмущаетесь? вы пользуете функцию read(). которая и предназначена для считывания ОДНОГО символа.
    Либо читайте символы в цикле(буквально пара строк к коду), либо посмотрите в библиотеке SD, какие еще есть функции для чтения из файла

    Но вообще, чтение строк посимвольно - самый простой и надежный (хотя можит и не быстрый) способ. Если читать большими кусками - надо сначала выделять память под них, да следить, чтоб памяти хватило - там куда больше ошибок можно насажать.
    А уж читать весь файл одним куском - и вовсе плохая идея, файлы ведь и в пару гигабайт бывают.
     
  11. Хохо! Спасибо за совет! Посмотрю про цикл и SD. Мне нужно считать все лишь несколько слов, думаю, что памяти хватит.
     
  12. b707

    b707 Гуру

    тогда самое простое - цикл вокруг оператора myFile.read()
    напрасно думаете.
    вопрос не в количестве памяти, а в правильном ее использовании. Можно подвесить программу, потеряв всего пару байт
     
  13. Куда хоть "копать", чтоб про цикл узнать? While ?
     
  14. b707

    b707 Гуру

    Алексей, за такие вопросы надо гнать с форума. Вот это напечатает вам 20 символов из файлв
    Код (C++):
    for (byte i =0; i <20; i++) Serial.print((char)myfile.read());
    возьмите любой учебник, и прочитайте про циклы for и while, а так же условные операторы
    Второй раз такую элементарщину я подсказывать не буду.

    Потому вы и читаете по целой ночи про стринги и не можете простейшей программы написать, что начинать надо с основ.
     
    Daniil нравится это.
  15. Спасибо, буду изучать!