Перейти к содержанию
    

Навигация по SD карте через USART

Здравствуйте. Появилась следующая задача: к STM32F103C8T6 подключена SD карта по SPI. Библиотека FatFS. Микроконтроллер читает содержимое карты и выдает список файлов в USART. На ПК в терминальной программе я наблюдаю этот список. Но не могу понять как получить обратную связь от ПК, а именно как указать МК по USART что я выбрал какой либо файл?

Пусть, например, на SD карте у меня 4 файла и одна папка. Я наблюдаю их в окне терминальной программы:

ПАПКА1

Data1.txt

SuperData.txt

BigDataSuperMegaLog.txt

Данные.txt

Как дать понять МК что я выбрал файл "Данные.txt" ? Чтобы он его прочитал и также выдал содержимое в USART. Или что я выбрал ПАПКА1 и МК прочитал содержимое этой папки и так же выдал в USART список файлов в ней. Пересылать названия скорее всего не очень правильная идея. Организовать буфер в МК и присвоить каждому файлу свой номер - не хватит ОЗУ. Может есть в FatFS какие то индексы у файлов?

 

Читаю список так:

Spoiler

	FRESULT result;
	FATFS FATFS_Obj;

	DIR dir;
	FILINFO fileInfo;
	char *fn;

	result = f_mount(&FATFS_Obj, "0:", 1);      // смонтировать диск
	if (result != FR_OK)
	  {
		printf("SD Card error %d\r\n", result);
	  }
	else {
	result = f_opendir(&dir, "/");  
	if (result == FR_OK)
	  {
	    while (((result = f_readdir(&dir, &fileInfo)) == FR_OK) && fileInfo.fname[0])
		  {
			fn = fileInfo.fname;

			if (fileInfo.fattrib & AM_DIR)
			  {
				USART_print(">");
			  }
			else
			  {
				USART_print("<");
			  }

			if (strlen(fn))
			  {
				Print_files(fn);
			  }
			else
			  {
				Print_files(fileInfo.fname);
			  }
		  }
		}

	f_closedir(&dir);

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, mr_smit сказал:

Как дать понять МК что я выбрал файл "Данные.txt" ? Чтобы он его прочитал и также выдал содержимое в USART. Или что я выбрал ПАПКА1 и МК прочитал содержимое этой папки и так же выдал в USART список файлов в ней. Пересылать названия скорее всего не очень правильная идея. Организовать буфер в МК и присвоить каждому файлу свой номер - не хватит ОЗУ. Может есть в FatFS какие то индексы у файлов?

1. Нарисуйте курсор на этом списке (или отдельным символом справа/слева от имени файла; или выделением имени цветом/инверсией/подчёркиванием и т.п.).

2. Перемещайте курсор по списку ESC-кодами.

3. Когда курсор окажется на нужном пункте списка, пошлите код ENTER.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я наверное не правильно выразился. Терминальная программа это для примера. Меня интересует ЧТО отправить, а не КАК. Это вопрос больше по части кода для микроконтроллера. Как организовать такое взаимодействие.

Можно в МК сделать присвоение:

1  -  ПАПКА1

2  -  Data1.txt

3  -  SuperData.txt

4  -  BigDataSuperMegaLog.txt

5  -  Данные.txt

 

Тогда после того как я отправлю список, в ответ достаточно будет отправить, например, 2, чтобы со стороны микроконтроллера обработать это и определить что пользователь выбрал Data1.txt. Ну а если файлов штук 150 ? Где этот список хранить. Да ещё и с длинными именами.

 

Поэтому я и спрашиваю есть ли какие то "маркеры", чтобы отправлять по USART этот маркер перед названием файла. И не создавать большие массивы для присвоения номера.  Т.е. выдать в USART что то типа:

 

15  -  ПАПКА1

324  -  Data1.txt

48  -  SuperData.txt

194  -  BigDataSuperMegaLog.txt

31  -  Данные.txt

 

И выбор 194 будет означать BigDataSuperMegaLog.txt. Вроде какие то индексы есть у файлов, но не могу найти информацию на этот счет.

Изменено пользователем mr_smit

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, mr_smit сказал:

Я наверное не правильно выразился. Терминальная программа это для примера. Меня интересует ЧТО отправить, а не КАК.

Что отправить я вам уже написал, читайте внимательнее:

16 минут назад, jcxz сказал:

пошлите код ENTER

А если "не терминальная программа" то тогда о чём вообще вопрос? :wacko2:

Для случая терминалки я вам ответил. А для случая "коня в вакууме" - отправлять можно что угодно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, mr_smit сказал:

Меня интересует ЧТО отправить

Да хоть что. Порядковый номер файла, его же имя...

9 минут назад, mr_smit сказал:

Я наверное не правильно выразился.

Вам следует как-то уточнить мысль. Мне до сих пор непонятно, что вам нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Со стороны ПК будет самописная программа. Т.е. после получения списка файлов, надо как то обратно сообщить МК какой файл нас интересует.

 

Да, можно отправить целиком название файла, но хотелось бы как то укоротить это до одного номера.

Изменено пользователем mr_smit

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 minutes ago, mr_smit said:

Тогда после того как я отправлю список, в ответ достаточно будет отправить, например, 2, чтобы со стороны микроконтроллера обработать это и определить что пользователь выбрал Data1.txt. Ну а если файлов штук 150 ? Где этот список хранить. Да ещё и с длинными именами.

Вы сделали проблему на ровном месте.
В моих дивайсах через  MQTT в JSON формате пересылаются списки более 1000 файлов с длинными именами в обе стороны.  
А MQTT как известно работает поверх TCP, а тот в свою очередь может работать и через USB и через RS232
Все промежуточные файлы сохраняются на той же SD карте.      
Но с таким слабым контроллером больше чем на пару сотен файлов на карте рассчитывать не стоит. Так что списки у вас будут достаточно короткие. 

Кстати , нам тут контрактный сборщик сообщил что c ST-шными процами серии  STM32F103 трагедия. 
Либо нет в стоке либо дорожают в два раза. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, mr_smit сказал:

Со стороны ПК будет самописная программа. Т.е. после получения списка файлов, надо как то обратно сообщить МК какой файл нас интересует.

Ну вот - зачем тогда обманывать про "терминалку"?  :russian_ru:

Если "самописная программа", то у неё должен быть какой-то протокол обмена с устройством. И что именно и как посылается - определяется полностью только этим протоколом. Если протокол самопальный - отправлять можно в каком угодно виде: хоть имя, хоть порядковый номер, хоть знак зодиака присвоенный файлу. Если протокол не самопальный, а какой-то стандарный - то читать описание "как в нём отправлять ссылки на файлы", и следовать этому описанию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, mr_smit сказал:

Да, можно отправить целиком название файла, но хотелось бы как то укоротить это до одного номера.

Вы уж сразу все подробности напишите. Чтобы мы тут в угадайку не играли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 minutes ago, jcxz said:

хоть имя, хоть порядковый номер, хоть знак зодиака присвоенный файлу.

Вот именно что присвоенный. Присваивать его в МК не хотелось бы. К тому же не понятно что делать с русскими именами в названиях. Сейчас включена поддержка длинных имен в FatFS и Unicode.  Но перед отправкой в USART всё равно приходится делать перекодировку из cp866 в win1251 чтобы правильно отобразить русский текст. Отсылать обратно русское имя и перекодировать его в МК опять же не удобно. Какой нибудь индекс файла в файловой системе решил бы все эти проблемы.

 

В процессе поиска информации наткнулся где то на arduino форум и заметил что там они используют file.dirIndex(). Описания подробного так и не нашел. Вот и подумалось мне что это как то реализуемо.

23 minutes ago, MrBearManul said:

Вы уж сразу все подробности напишите. Чтобы мы тут в угадайку не играли.

Так я ничего и не скрываю. Есть STM32 подключенный к ПК через преобразователь USART-USB на FT232. В свою очередь к STM32 ещё подключена SD карточка. Задача прочитать содержимое файла на SD карте, но его перед этим надо как то выбрать. Вот и вопрос как более правильно организовать этот выбор.

Изменено пользователем mr_smit

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно просто динамически присваивать номера папкам\файлам исходя из текущего места положения.

положение в корне.

1 folder_a

2 folder_b

3 file1

4 file2

Положение в folder_a

 folder_a

  1 folder_c

  2 file_a1

  3 file_a2

 

 

Изменено пользователем VladimirG

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. при выдаче в USART добавлять номер, а при получении номера обратно, просто считать файлы? И дойдя до нужного номера открывать? Это скорее всего будет очень долго.

Изменено пользователем mr_smit

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 минут назад, mr_smit сказал:

Это скорее всего будет очень долго.

Вам не угодишь)

36 минут назад, mr_smit сказал:

Т.е. при выдаче в USART добавлять номер

Зачем? Просто передавайте их по порядку, номер и так будет приёмнику известен.

1 час назад, mr_smit сказал:

Вот и вопрос как более правильно организовать этот выбор.

Никак не правильно. Можно любым образом. Важны лишь критерии этого выбора. И их вам следует уже назвать.

1 час назад, mr_smit сказал:

Так я ничего и не скрываю.

Только каждый раз добавляете новые подробности...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ладно, думаю действительно проще будет передавать названия целиком и не заморачиваться. Всем спасибо )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, mr_smit said:

Ладно, думаю действительно проще будет передавать названия целиком и не заморачиваться. Всем спасибо )

Мало RAM-а, отсюда все проблемы.
64K обычно отдают на кэш файловой системе, а у вас на все 64К
С таким объемом любая мелочь головняк будет создавать. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...