Просмотр файлов на SD карте
|
|
marss70 | Дата: Суббота, 10.09.2016, 19:46 | Сообщение # 1 |
Группа: Проверенные
Сообщений: 80
Статус: Offline
| Привет, всем! Нужна помощь в организации просмотра файлов на SD карте. Рабочий код позволяет читать построчно текстовую переменную К из файла "Mach2mm.cnc" и выводить на дисплей. Но проблема в том, что нужно точно указать с какого файла читать. А мне нужно организовать прокрутку файлов на дисплее и выбор с какого читать. Код $regfile = "m32def.dat" $crystal = 16000000 $hwstack = 100 $swstack = 100 $framesize = 100
$include "Config_MMCSD_HC.bas" $include "Config_AVR-DOS.BAS"
Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5 Cursor Off Cls
Config Serialin = Buffered , Size = 20 Config Clock = Soft Enable Interrupts Config Date = Dmy , Separator = .
Dim K As String * 24
Lcd "Test_Dos_Drive compiled at " ; Version()
Wait 1 Cls 'Dim Btemp1 As Byte Lcd "Wait for Drive" Wait 1 Cls If Gbdriveerror = 0 Then ' Include AVR-DOS Configuration and library
Lcd "Init File System ... "; Wait 1 Cls Btemp1 = Initfilesystem(1) ' Partition 1 ' use 0 for drive without Master boot record If Btemp1 <> 0 Then Lcd "Error: " ; Btemp1 ; " at Init file system" Wait 2 Cls
Else Lcd " OK!" Wait 1 Cls End If Else Lcd "Error during Drive Init: " ; Lowerline Lcd Gbdriveerror Wait 2 Cls End If
Do
Open "Mach2mm.cnc" For Input As #1 Input #1 , K ' write is also supported 'Close #1
Lcd "Read Mach2mm.cnc" Lowerline Lcd K Waitms 200 Cls Loop End
Сообщение отредактировал marss70 - Суббота, 10.09.2016, 19:48 |
|
| |
exersizze | Дата: Воскресенье, 11.09.2016, 17:56 | Сообщение # 2 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| В avr-dos есть команда Dir, которая возвращает имя файла по маске. Подробнее http://roboforum.ru/wiki....DOS#Dir
|
|
| |
marss70 | Дата: Понедельник, 12.09.2016, 22:24 | Сообщение # 3 |
Группа: Проверенные
Сообщений: 80
Статус: Offline
| Спасибо! Сделал так:
Do
Chdir "TEMP" 'Меняем директорию на "TEMP" Max_file = 0 Str_temp = Dir( "*.cnc") 'выбираем имя первого файла на в корневом каталоге с расширением *.cnc 'If Len(str_temp) > 0 Then Index = 1 'если файл существует устанавливаем номер текущего файла 1 While Len(str_temp) > 0 'запускаем цикл пока имя файла не станет равным 0 - файлы кончатся Max_file = Max_file + 1 'увеличиваем значение переменной количества файлов
Lcd "Read Str_temp" ; " " ; Index Lowerline Lcd Str_temp Waitms 2000 Cls
'выводим на экран имя файла
Lcd "Read Max_file " Lowerline Lcd Max_file Waitms 2000 'выводим общее число файлов Cls Str_temp = Dir() 'получаем имя следующего вайла в каталоге Wend
Loop End
помог ещё один хороший человек. Тогда ещё один вопрос: как организовать просмотр папок на карте? Как основать папку понятно(MkDir). Как открыть папку тоже понятно.
Сообщение отредактировал marss70 - Понедельник, 12.09.2016, 22:27 |
|
| |
exersizze | Дата: Понедельник, 12.09.2016, 23:48 | Сообщение # 4 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| Нужно создать типа буфера в котором будут сохраняться имена найденных папок. По сути надо завести дополнительные переменные и после обнаружения новой папки записывать имя в одну из переменных. например dim A(10) as string*5 dim N as byte каждую новую итерацию в цикле увеличиваем переменную N, и записываем имя найденной папки в переменную A(n)=Str_temp получим в итоге некоторое количество N найденных папок, имена которых хранятся в диапазоне A(1) - A(N). А дальше останется только считывать значения этих переменных
|
|
| |
marss70 | Дата: Вторник, 13.09.2016, 20:22 | Сообщение # 5 |
Группа: Проверенные
Сообщений: 80
Статус: Offline
| А какие команды "отвечают" за название папки?
Сообщение отредактировал marss70 - Вторник, 13.09.2016, 20:23 |
|
| |
exersizze | Дата: Вторник, 13.09.2016, 23:48 | Сообщение # 6 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| команда Str_temp = Dir( "*.cnc") что возвращает в Str_temp?
|
|
| |
marss70 | Дата: Среда, 14.09.2016, 14:40 | Сообщение # 7 |
Группа: Проверенные
Сообщений: 80
Статус: Offline
| Str_temp = Dir( "*.cnc") 'выбираем имя первого файла на в корневом каталоге с расширением *.cnc
Это сам файл с расширением *.cnc А вот название самой папки где лежит этот сам файл как прочитать?
Сообщение отредактировал marss70 - Среда, 14.09.2016, 14:49 |
|
| |
exersizze | Дата: Среда, 14.09.2016, 22:19 | Сообщение # 8 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| А, речь же о папках, извиняюсь, спутал. Есть команда которой можно выбрать директорию на диске, но при этом путь должен быть известен заранее (http://avrhelp.mcselec.com/index.html?chdir.htm). А вот считать названия папок на диске как не нашел. Подозреваю что просто не поддерживается такое Хотя задумка интересная, если получится создать полноценную навигацию по диску, держи нас в курсе
|
|
| |
marss70 | Дата: Четверг, 15.09.2016, 13:08 | Сообщение # 9 |
Группа: Проверенные
Сообщений: 80
Статус: Offline
| Ну вроде как уважаемый Radan посоветовал вот так: 'В одной папке не более 512 файлов! Chdir "\" 'Идём в корень диска Chdir "Speech" 'Меняем директорию карты памяти на "Speech" Chdir "." 'На директорию выше Chdir "Mine" 'Меняем директорию карты памяти на "Mine" File_name = Str(mine) + "m.wav" 'полное имя файла из директории и краткого имени
Будем пробовать.
Сообщение отредактировал marss70 - Четверг, 15.09.2016, 13:09 |
|
| |
marss70 | Дата: Четверг, 15.09.2016, 23:31 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 80
Статус: Offline
| Ну как-бы так... В цикле выводятся названия папок.
Код $regfile = "m32def.dat" $crystal = 16000000 $hwstack = 100 $swstack = 100 $framesize = 100
$include "Config_MMCSD_HC.bas" $include "Config_AVR-DOS.BAS"
Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5 Cursor Off Cls
Config Serialin = Buffered , Size = 20 Config Clock = Soft Enable Interrupts Config Date = Dmy , Separator = .
Dim Имя_файла_str As String * 12 Dim Имя_директории_str As String * 12 Dim Счетчик_файлов As Word Dim Количество_найденных_файлов As Word Dim Количество_найденных_директорий As Word
Lcd "Test_Dos_Drive " ; Version()
Wait 1 Cls 'Dim Btemp1 As Byte Lcd "Wait for Drive" Wait 1 Cls If Gbdriveerror = 0 Then ' Include AVR-DOS Configuration and library
Lcd "Init File System ... "; Wait 1 Cls Btemp1 = Initfilesystem(1) ' Partition 1 ' use 0 for drive without Master boot record If Btemp1 <> 0 Then Lcd "Error: " ; Btemp1 ; " at Init file system" Wait 2 Cls
Else Lcd " OK!" Wait 1 Cls End If Else Lcd "Error during Drive Init: " ; Lowerline Lcd Gbdriveerror Wait 2 Cls End If Do Имя_директории_str = Dir( "*.") ' Выбираем имя первого файла в каталоге While Len(имя_директории_str) > 0 ' Пока длина названия папки больше 0 ' Выводим: имя файла Lcd "Name Dir" ; " " ; Имя_директории_str Waitms 2000 Cls Имя_директории_str = Dir() ' Ищем дальше Wend
Loop End
Сообщение отредактировал marss70 - Четверг, 15.09.2016, 23:34 |
|
| |
exersizze | Дата: Пятница, 16.09.2016, 00:20 | Сообщение # 11 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| тоесть Dir( "*.") возвращает имя первой папки?
|
|
| |
marss70 | Дата: Пятница, 16.09.2016, 09:00 | Сообщение # 12 |
Группа: Проверенные
Сообщений: 80
Статус: Offline
| Получается, что так. Сейчас буду думать, как выводить список папок на многострочном дисплее с функцией выбора папки и соответственно выбора файлов с выбранной папки. Добрые люди посоветовали посмотреть в сторону http://elektron.ucoz.ua/load....1-0-57
|
|
| |