Помогите с заполнением массива из Serial.Port

Roma_N
Offline
Зарегистрирован: 06.05.2019

Привет друзья!Ковыряюсь тут нынче с модулем USB HOST на базе CH376S,отличная штуковина,можно логи писать на обычную USB флешку.И вот задался идеей перенести всё это на диспей,чтобы можно было читать лог на дисплейчике 128х64.
Имена файлов будут типа:
1033

1080

2009

Это обычные текстовые документы.
В них же внутри будет примерно вот такое

2032 10 10  
1342 10 14  
1242 10 12  
922 12 12  
922 12 14  
1332 10 12  
1322 10 10  
1322 10 10  
1242 12 12  
1242 14 12  
1482 12 12  
1482 12 10  
1242 10 10  
892 12 10  
862 10 10  
488 12 12  
1342 10 12  
892 10 12  
802 10 14  
498 10 12  

Так вот,для того чтобы увидеть все имена файлов которые есть на флешке я написал небольшой код который выводит их монитор порта.Ну и заодно читает тестовый файлик TEST1.TXT.


#include <Ch376msc.h>
Ch376msc flashDrive(Serial3, 115200); // Устанавливаем скорость порта для модуля на Serial3 - 115200)
char Buffer[255];                     // Максимальная длинна  255 = 254 char + 1 символ NULL
const int ROW = 100, COL = 30;
int FilesArray[30];
int File_Sizes_Array[ROW][COL];
void setup() {
  Serial.begin(115200);
  flashDrive.init();
   
  while(flashDrive.listDir()){
    Serial.println(flashDrive.getFileName());   //Получаем имя файлов
    
  }
  Serial.println("*******************************Read File*************************************");
       flashDrive.setFileName("TEST1.TXT");     //Выбираем имя файлв
          flashDrive.openFile();                //Открываем этот файл      
       flashDrive.readFile(Buffer, sizeof(Buffer)); //Читаем всё из файла
          Serial.print(Buffer);             //Печатаем в монитор порта
        flashDrive.closeFile();                 //И в в конце закрываем файл

        for (int j = 0; j < 30; j++){
          flashDrive.listDir();
           FilesArray[j] = flashDrive.getFileName();
      }
      Serial.println("*******************************MASSIVE*************************************");
         for (int i = 0; i < 30; i++){
            Serial.println(FilesArray[i]);
      }
}

void loop() {
}

Ну и теперь мне нужно все имена поместить в массив FilesArray, который в дальнейшем буду выводить для выбора.

И прочитать содержимое всех файлов(только первую колонку) и поместить их тоже в массив только уже двумерный File_Sizes_Array где колонки будут отвечать за сами файлы а строки это сами данные прочитаные из файла.
Я уже пробовал заполнить как видно по коду но заполняется левыми цифрами какими-то но не тем что надо.Причём одинаковыми цифрами.
Вот результат из монитора порта:

SYSTEM~1   
TEST1   TXT
TEST2   TXT
TEST3   TXT
TEST4   TXT
*******************************Read File*************************************
2032 10 10
1342 10 14
1242 10 12
922 12 12
922 12 14
1332 10 12
1322 10 10
1322 10 10
1242 12 12
1242 14 12
1482 12 12
1482 12 10
1242 10 10
892 12 10
862 10 10
488 12 12
1342 10 12
892 10 12
802 10 14
498 10 12
*******************************MASSIVE*************************************
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
1367
 
И вот собственно обращаюсь за помощью к Вам.Помогите пожалуйста разобраться с этой проблеммой.
 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1.
В строке №24 Вы зачем-то пытаетесь переменной типа int ( FilesArray[j] ) присвоить указатель на символ (результат функции flashDrive.getFileName())

2.
Вы пока никак и нигде не используете масив File_Sizes_Array, а потому, компилятор/линкер его просто выбросили из кода. НО как только Вы начнёте его использовать, от отъест почти всю память Вашей Меги. Останутся совсем копейки.

Roma_N
Offline
Зарегистрирован: 06.05.2019

Да,увидел,не правильно объявил массив.
Должно быть так:

char FilesArray[30];

По поводу памяти если чесно чего-то не подумал....А какие есть ещё варианты?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю, но этот массив займёт 30*100*2 = 6000 байтов

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Roma_N пишет:

Должно быть так:

char FilesArray[30];

Не должно быть.

Тогда в той же строке Вы будете присваивать символу значение указателя на символ. За типами-то следите!

Roma_N
Offline
Зарегистрирован: 06.05.2019

Евгений,понимаю что туплю,но не могу понять как мне сделать заполнение,хоть убей.Если можете,обьясните пожалуйста.

b707
Онлайн
Зарегистрирован: 26.05.2017

Roma_N пишет:

Евгений,понимаю что туплю,но не могу понять как мне сделать заполнение

не надо вам делать заполнения массива именами файлов - такой массив тоже может получится слишком большим в памяти.

Делайте так, как начали - когда нужен список файлов - читайте его из каталога и сразу показывайте на экране. никуда не сохраняя

Roma_N
Offline
Зарегистрирован: 06.05.2019

Я такой вариант думал сразу сделать,но есть некоторые загвоздки:

Как использовать данные из файла?Допустим я открыл файл,там есть таблица с цифрами как я выше указал и (в качестве примера мне нужно управлять шаговиком) нужно покрутить шаговик количество раз указанное в этом файле во всех строках поочерёдно?

b707
Онлайн
Зарегистрирован: 26.05.2017

Roma_N пишет:

Как использовать данные из файла?Допустим я открыл файл,там есть таблица с цифрами как я выше указал и (в качестве примера мне нужно управлять шаговиком) нужно покрутить шаговик количество раз указанное в этом файле во всех строках поочерёдно?

да точно так же, читайете строку - исполняете. Потом читаете следующую. Грузить весь файл в память смысла нет, да и часто просто невозможно, фалы и по гигабайту бывают.

Roma_N
Offline
Зарегистрирован: 06.05.2019

Попробовал прочитать и вывести на дисплей.
В библиотеке U8glib для вывода строк раздельно нужо указывать координаты каждой строки,а у меня получается всё лепит в одну строку и данные в строке постоянно меняются.


#include "U8glib.h"
U8GLIB_ST7920_128X64_4X u8g(52, 51, 53);  //указание пинов для использования дисплея, не обязательно брать пины аппаратного SPI
#include <Ch376msc.h>
Ch376msc flashDrive(Serial3, 115200); // Устанавливаем скорость порта для модуля на Serial3 - 115200)
char Buffer[255];                     // Максимальная длинна  255 = 254 char + 1 символ NULL
const int ROW = 100, COL = 30;
char FilesArray[COL];
int File_Sizes_Array[ROW][COL];
void setup() {
  Serial.begin(115200);
  flashDrive.init();

  

Serial.println("*******************************Read File***********************************");
       flashDrive.setFileName("1033.TXT");     //Выбираем имя файлв
          flashDrive.openFile();                //Открываем этот файл      
       flashDrive.readFile(Buffer, sizeof(Buffer)); //Читаем всё из файла
          Serial.print(Buffer);             //Печатаем в монитор порта
        flashDrive.closeFile();                 //И в в конце закрываем файл
        
Serial.println("*******************************MASSIVE*************************************");
        for (int j = 0; j < COL; j++){
          flashDrive.listDir();
           FilesArray[j] = flashDrive.getFileName();
      }
         for (int i = 0; i < COL; i++){
            Serial.println(FilesArray[i]);
   }
}


void loop() {

  
     u8g.firstPage();  
  do {
      u8g.setFont(u8g_font_unifont);
       
      
    flashDrive.listDir();                       //Перескакиваем на следующий файл
    u8g.setPrintPos(0, 10);  
    u8g.print(flashDrive.getFileName());
    Serial.println(flashDrive.getFileName());   //Получаем имя файлов  
         
  } while( u8g.nextPage() );
}
b707
Онлайн
Зарегистрирован: 26.05.2017

Roma_N пишет:

В библиотеке U8glib

недавно обсуждали - для вывода текста лучше взять другую библиотеку. без буфера и не такую замороченную

Roma_N
Offline
Зарегистрирован: 06.05.2019

Не подскажете как темка называлась? Интересно было бы почитать.

Feofan
Offline
Зарегистрирован: 28.05.2017
Roma_N
Offline
Зарегистрирован: 06.05.2019

Да,библиотека хороша,но для меня к сожалению не подойдёт.Я затупил и не указал что дисплей то у меня на ST7920 а не Oled.