Горячая замена SD карт со снандартной библиотекой SD.h

Eretik
Offline
Зарегистрирован: 22.06.2018

День добрый стала необходимость горячей замены SD карт в устройстве без его перезапуска. Проблема в том что инициализация карты SD.begin(pin), при повторном вводе не позволяет прочитать карту до перезагрузки. То есть нужно либо найти как можно деинициализировать карту противополжность команде SD.begin(pin), и повторно когда она будет вставлена ввести SD.begin(pin) с положительным результатом. Все больше убеждаюсь что это с данной библиотекой не выполнимо. Тогда посоветуйте библиотеку с которой это можно выполнить. За ранее спасибо!

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

А факт того, что вставили новую карту Вам известен? Т.е. Вы можете понять, что карту вставили, просто не можете переинициализировать? Так?

Eretik
Offline
Зарегистрирован: 22.06.2018

Я говорю про одну и туже карту! ТОесть мне нужно ее вытянуть и вставить обратно и уже инициализация не проходит!

Да да именно так!

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

Т.е. Вы знаете, что её вставили, проблема только с инициализацией?

А как Вы пробовали? Мне неохота долго рыться в библиотеке, но уверен, что если объект уничтожить целиком и создать заново, он должен нормально проинициализироваться. Это, конечно, жёстко, если порыться в библиотеке, то наверняка и "помягче" можно, но работать это должно. Попробуйте. Или Вы это пробовали?

Eretik
Offline
Зарегистрирован: 22.06.2018

Да проблема заново инициализировать.

Я не могу найти как деинициализировать... противоположность SD.begin. Переназначения на другой пин и потом обратно на нужный так же не помогает!

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

Да, нет, не деинициализирвать. Целиком уничтожить. Просто не используйте их статический объект SD, а создайте свой.

//
// Опишите где-ни будь глобально вот такой указатель
//
SDClass * mySD = NULL;

//
// Всякий раз, когда надо "создать заново"
// (включая и самый первый раз) делаем так
//
	delete mySD;
	mySD = new SDClass;
	//...
	mySD->begin(....

Только везде пишите не mySD.la-la , а mySD->la-la

По идее должно работать.

Хотя метода, конечно ... как головную боль гильотиной лечить.

Eretik
Offline
Зарегистрирован: 22.06.2018

Спасибо, что откликнулись! Прошу прощения что я немного вас вел в заблуждения, у меня тут три карточки разных проивзодителей  и разных объемов 128мб, 1гб и 2 гб. И действительно обнаружил что та карточка что изначально инициализировалась при включении, она видна после вытягивания, но не другая, тоесть SD.begin при инициализации видет что за карточка объем тип и показывает только ее при повторном всовывание. Но вашу подсказку возъму на вооружение когда мне нужно будет делать для различных карт!

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

Вы бы проверили, работает ли она. По идее должна, но сам я не проверял.

Logik
Offline
Зарегистрирован: 05.08.2014

Может чтото типа SD.end() вызвать перед SD.begin ?

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Logik пишет:

Может чтото типа SD.end() вызвать перед SD.begin ?

Так, был бы - можно было б и вызвать, а то ж нету.

Студент
Offline
Зарегистрирован: 15.10.2018

ЕвгенийП пишет:

Да, нет, не деинициализирвать. Целиком уничтожить. Просто не используйте их статический объект SD, а создайте свой.

//
// Опишите где-ни будь глобально вот такой указатель
//
SDClass * mySD = NULL;

//
// Всякий раз, когда надо "создать заново"
// (включая и самый первый раз) делаем так
//
	delete mySD;
	mySD = new SDClass;
	//...
	mySD->begin(....

Только везде пишите не mySD.la-la , а mySD->la-la

По идее должно работать.

Хотя метода, конечно ... как головную боль гильотиной лечить.

Спасибо, помогло ))

jonhson
Offline
Зарегистрирован: 11.09.2019

А можно попросить листинг программы...  А то, если честно, до обьектноориентированного программирования я не дорос.. . А похожая проблема - имеется.. 

Студент
Offline
Зарегистрирован: 15.10.2018

А на ESP32 SDClass не находится, похоже там какой то другой =(