mr_smit 0 17 марта, 2021 Опубликовано 17 марта, 2021 · Жалоба Здравствуйте. Появилась следующая задача: к 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 17 марта, 2021 Опубликовано 17 марта, 2021 · Жалоба 13 минут назад, mr_smit сказал: Как дать понять МК что я выбрал файл "Данные.txt" ? Чтобы он его прочитал и также выдал содержимое в USART. Или что я выбрал ПАПКА1 и МК прочитал содержимое этой папки и так же выдал в USART список файлов в ней. Пересылать названия скорее всего не очень правильная идея. Организовать буфер в МК и присвоить каждому файлу свой номер - не хватит ОЗУ. Может есть в FatFS какие то индексы у файлов? 1. Нарисуйте курсор на этом списке (или отдельным символом справа/слева от имени файла; или выделением имени цветом/инверсией/подчёркиванием и т.п.). 2. Перемещайте курсор по списку ESC-кодами. 3. Когда курсор окажется на нужном пункте списка, пошлите код ENTER. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mr_smit 0 17 марта, 2021 Опубликовано 17 марта, 2021 (изменено) · Жалоба Я наверное не правильно выразился. Терминальная программа это для примера. Меня интересует ЧТО отправить, а не КАК. Это вопрос больше по части кода для микроконтроллера. Как организовать такое взаимодействие. Можно в МК сделать присвоение: 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. Вроде какие то индексы есть у файлов, но не могу найти информацию на этот счет. Изменено 17 марта, 2021 пользователем mr_smit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 17 марта, 2021 Опубликовано 17 марта, 2021 · Жалоба 9 минут назад, mr_smit сказал: Я наверное не правильно выразился. Терминальная программа это для примера. Меня интересует ЧТО отправить, а не КАК. Что отправить я вам уже написал, читайте внимательнее: 16 минут назад, jcxz сказал: пошлите код ENTER А если "не терминальная программа" то тогда о чём вообще вопрос? Для случая терминалки я вам ответил. А для случая "коня в вакууме" - отправлять можно что угодно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 17 марта, 2021 Опубликовано 17 марта, 2021 · Жалоба 8 минут назад, mr_smit сказал: Меня интересует ЧТО отправить Да хоть что. Порядковый номер файла, его же имя... 9 минут назад, mr_smit сказал: Я наверное не правильно выразился. Вам следует как-то уточнить мысль. Мне до сих пор непонятно, что вам нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mr_smit 0 17 марта, 2021 Опубликовано 17 марта, 2021 (изменено) · Жалоба Со стороны ПК будет самописная программа. Т.е. после получения списка файлов, надо как то обратно сообщить МК какой файл нас интересует. Да, можно отправить целиком название файла, но хотелось бы как то укоротить это до одного номера. Изменено 17 марта, 2021 пользователем mr_smit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 17 марта, 2021 Опубликовано 17 марта, 2021 · Жалоба 24 minutes ago, mr_smit said: Тогда после того как я отправлю список, в ответ достаточно будет отправить, например, 2, чтобы со стороны микроконтроллера обработать это и определить что пользователь выбрал Data1.txt. Ну а если файлов штук 150 ? Где этот список хранить. Да ещё и с длинными именами. Вы сделали проблему на ровном месте. В моих дивайсах через MQTT в JSON формате пересылаются списки более 1000 файлов с длинными именами в обе стороны. А MQTT как известно работает поверх TCP, а тот в свою очередь может работать и через USB и через RS232 Все промежуточные файлы сохраняются на той же SD карте. Но с таким слабым контроллером больше чем на пару сотен файлов на карте рассчитывать не стоит. Так что списки у вас будут достаточно короткие. Кстати , нам тут контрактный сборщик сообщил что c ST-шными процами серии STM32F103 трагедия. Либо нет в стоке либо дорожают в два раза. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 17 марта, 2021 Опубликовано 17 марта, 2021 · Жалоба 4 минуты назад, mr_smit сказал: Со стороны ПК будет самописная программа. Т.е. после получения списка файлов, надо как то обратно сообщить МК какой файл нас интересует. Ну вот - зачем тогда обманывать про "терминалку"? Если "самописная программа", то у неё должен быть какой-то протокол обмена с устройством. И что именно и как посылается - определяется полностью только этим протоколом. Если протокол самопальный - отправлять можно в каком угодно виде: хоть имя, хоть порядковый номер, хоть знак зодиака присвоенный файлу. Если протокол не самопальный, а какой-то стандарный - то читать описание "как в нём отправлять ссылки на файлы", и следовать этому описанию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 17 марта, 2021 Опубликовано 17 марта, 2021 · Жалоба 14 минут назад, mr_smit сказал: Да, можно отправить целиком название файла, но хотелось бы как то укоротить это до одного номера. Вы уж сразу все подробности напишите. Чтобы мы тут в угадайку не играли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mr_smit 0 17 марта, 2021 Опубликовано 17 марта, 2021 (изменено) · Жалоба 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 карте, но его перед этим надо как то выбрать. Вот и вопрос как более правильно организовать этот выбор. Изменено 17 марта, 2021 пользователем mr_smit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirG 0 17 марта, 2021 Опубликовано 17 марта, 2021 (изменено) · Жалоба Можно просто динамически присваивать номера папкам\файлам исходя из текущего места положения. положение в корне. 1 folder_a 2 folder_b 3 file1 4 file2 Положение в folder_a folder_a 1 folder_c 2 file_a1 3 file_a2 Изменено 17 марта, 2021 пользователем VladimirG Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mr_smit 0 17 марта, 2021 Опубликовано 17 марта, 2021 (изменено) · Жалоба Т.е. при выдаче в USART добавлять номер, а при получении номера обратно, просто считать файлы? И дойдя до нужного номера открывать? Это скорее всего будет очень долго. Изменено 17 марта, 2021 пользователем mr_smit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 17 марта, 2021 Опубликовано 17 марта, 2021 · Жалоба 36 минут назад, mr_smit сказал: Это скорее всего будет очень долго. Вам не угодишь) 36 минут назад, mr_smit сказал: Т.е. при выдаче в USART добавлять номер Зачем? Просто передавайте их по порядку, номер и так будет приёмнику известен. 1 час назад, mr_smit сказал: Вот и вопрос как более правильно организовать этот выбор. Никак не правильно. Можно любым образом. Важны лишь критерии этого выбора. И их вам следует уже назвать. 1 час назад, mr_smit сказал: Так я ничего и не скрываю. Только каждый раз добавляете новые подробности... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mr_smit 0 17 марта, 2021 Опубликовано 17 марта, 2021 · Жалоба Ладно, думаю действительно проще будет передавать названия целиком и не заморачиваться. Всем спасибо ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 17 марта, 2021 Опубликовано 17 марта, 2021 · Жалоба 1 hour ago, mr_smit said: Ладно, думаю действительно проще будет передавать названия целиком и не заморачиваться. Всем спасибо ) Мало RAM-а, отсюда все проблемы. 64K обычно отдают на кэш файловой системе, а у вас на все 64К С таким объемом любая мелочь головняк будет создавать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться