Помогите с заполнением массива из Serial.Port
- Войдите на сайт для отправки комментариев
Привет друзья!Ковыряюсь тут нынче с модулем 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 где колонки будут отвечать за сами файлы а строки это сами данные прочитаные из файла.
Я уже пробовал заполнить как видно по коду но заполняется левыми цифрами какими-то но не тем что надо.Причём одинаковыми цифрами.
Вот результат из монитора порта:
1.
В строке №24 Вы зачем-то пытаетесь переменной типа int ( FilesArray[j] ) присвоить указатель на символ (результат функции flashDrive.getFileName())
2.
Вы пока никак и нигде не используете масив File_Sizes_Array, а потому, компилятор/линкер его просто выбросили из кода. НО как только Вы начнёте его использовать, от отъест почти всю память Вашей Меги. Останутся совсем копейки.
Да,увидел,не правильно объявил массив.
Должно быть так:
По поводу памяти если чесно чего-то не подумал....А какие есть ещё варианты?
Не знаю, но этот массив займёт 30*100*2 = 6000 байтов
Должно быть так:
Не должно быть.
Тогда в той же строке Вы будете присваивать символу значение указателя на символ. За типами-то следите!
Евгений,понимаю что туплю,но не могу понять как мне сделать заполнение,хоть убей.Если можете,обьясните пожалуйста.
Евгений,понимаю что туплю,но не могу понять как мне сделать заполнение
не надо вам делать заполнения массива именами файлов - такой массив тоже может получится слишком большим в памяти.
Делайте так, как начали - когда нужен список файлов - читайте его из каталога и сразу показывайте на экране. никуда не сохраняя
Я такой вариант думал сразу сделать,но есть некоторые загвоздки:
Как использовать данные из файла?Допустим я открыл файл,там есть таблица с цифрами как я выше указал и (в качестве примера мне нужно управлять шаговиком) нужно покрутить шаговик количество раз указанное в этом файле во всех строках поочерёдно?
Как использовать данные из файла?Допустим я открыл файл,там есть таблица с цифрами как я выше указал и (в качестве примера мне нужно управлять шаговиком) нужно покрутить шаговик количество раз указанное в этом файле во всех строках поочерёдно?
да точно так же, читайете строку - исполняете. Потом читаете следующую. Грузить весь файл в память смысла нет, да и часто просто невозможно, фалы и по гигабайту бывают.
Попробовал прочитать и вывести на дисплей.
В библиотеке 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() ); }В библиотеке U8glib
недавно обсуждали - для вывода текста лучше взять другую библиотеку. без буфера и не такую замороченную
Не подскажете как темка называлась? Интересно было бы почитать.
http://arduino.ru/forum/proekty/asoled-kompaktnaya-biblioteka-dlya-oled-displeya-128kh64-s-kirillitsei-utf-8
Да,библиотека хороша,но для меня к сожалению не подойдёт.Я затупил и не указал что дисплей то у меня на ST7920 а не Oled.