Страница 1 из 2
Работа с секторами USB FLASH памяти
Добавлено: 19 янв 2017, 16:27
CCCP33
Добрый день, коллеги! Надеюсь на вашу помощь по следующей проблеме:
Имеется USB 1.1 устройство, при подключении определяется как "съемный диск" (USB Mass Storage Device).
Передача команд в устройсто осуществляется путем записи в 7 сектор этого USB накопителя (512 байт). Запись должна производиться «односекторной» операцией.
В общем суть проста - считывать и записывать ячейки FLASH-памяти в LV. В CVI работает такой код:
#include <ansi_c.h>
#define sec 512
#define sec7 sec*7l
char buf[sec] = "Название устройства";
int main (int argc, char *argv[])
{
FILE *FL;
int num;
FL = fopen("\\\\.\\G:", "rb+"); // как также достучаться, чтобы работать с флешкой как с бинарником?
buf[0x40] = 0x81;
num = fseek(FL, sec7, SEEK_SET);
num = fwrite(buf, sec, 1, FL);
num = fflush(FL);
num = fclose(FL);
return 0;
}
Re: Работа с секторами USB FLASH памяти
Добавлено: 19 янв 2017, 19:40
dadreamer
CCCP33 писал(а):FL = fopen("\\\\.\\G:", "rb+"); [/b] // как также достучаться, чтобы работать с флешкой как с бинарником?}
CreateFile со-товарищи
Например, что-то такое
Код: Выделить всё
hDevice = CreateFile(@"\.\G:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
Re: Работа с секторами USB FLASH памяти
Добавлено: 20 янв 2017, 15:44
CCCP33
Этот Handle можно как-то использовать при работе с функциями из File I/O Pallete?
Re: Работа с секторами USB FLASH памяти
Добавлено: 20 янв 2017, 15:57
dadreamer
CCCP33 писал(а):Этот Handle можно как-то использовать при работе с функциями из File I/O Pallete?
Теоретически, да. В файловом менеджере
есть вот такая функция:
FNewRefNum
Собственно, на вход ей надо подать путь к файлу и дескриптор, а она выдаст обычный refnum, которые далее можно в
использовать. Остаётся только сконвертировать хэндл WinAPI в File *. Если будет время, попробую позднее выложить какой-нибудь пример. Вообще, если бы удалось "скормить" инструменту
Open/Create/Replace File путь к диску (а не к файлу), и он бы не заругался, то дальше можно было бы спокойно юзать стандартые
для работы с файлами (так как все они на Винде работают через WinAPI). Но, к сожалению, диски этот
почему-то открывать не хочет.
Ну, или можете, как вариант, реализовать всю работу на стандартных ReadFile/WriteFile из арсенала ОС.
Re: Работа с секторами USB FLASH памяти
Добавлено: 20 янв 2017, 16:21
CCCP33
Был бы благодарен за пример. Пока не очень представляю как работать с файловым менеджером и его функциями в программе
Re: Работа с секторами USB FLASH памяти
Добавлено: 20 янв 2017, 18:21
Blackman
Re: Работа с секторами USB FLASH памяти
Добавлено: 20 янв 2017, 19:46
dadreamer
Вы этими
диск не откроете.
Их нужно допиливать. Path Control не принимает пути вида
\\.\девайс.
CCCP33 писал(а):Был бы благодарен за пример. Пока не очень представляю как работать с файловым менеджером и его функциями в программе
Ну, вот простейший пример бинарного чтения.
По аналогии сделаете запись, получение/установку "курсора" и прочие вещи.
Re: Работа с секторами USB FLASH памяти
Добавлено: 20 янв 2017, 20:25
CCCP33
а как же FNewRefNum? Используя пример c FNewRefNum Blackman'а не получилось получить refnum, чтобы работать с функциями File I/O Pallete.
P.S Пример почему то ничего не считывает с этой "флешки". Читаю 512*8 байт
Re: Работа с секторами USB FLASH памяти
Добавлено: 20 янв 2017, 21:02
dadreamer
CCCP33 писал(а):а как же FNewRefNum? Используя пример c FNewRefNum Blackman'а не получилось получить refnum, чтобы работать с функциями File I/O Pallete.
P.S Пример почему то ничего не считывает с этой "флешки". Читаю 512*8 байт
Забудьте. Используйте CreateFile -> Read/WriteFile -> CloseHandle.
Хм. А какую-то ошибку выдаёт? У меня мою флэшку читает нормально. И локальные диски тоже. Можете попробовать вместо буквы диска указывать его номер:
\\.\PHYSICALDRIVE#, где
# - номер диска. Определить номер можно с помощью запроса в командной строке:
Re: Работа с секторами USB FLASH памяти
Добавлено: 20 янв 2017, 23:44
Blackman
dadreamer писал(а):Вы этими
диск не откроете.
Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.
???
Re: Работа с секторами USB FLASH памяти
Добавлено: 21 янв 2017, 00:05
dadreamer
Blackman писал(а):dadreamer писал(а):Вы этими
диск не откроете.
Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.
???
Ну ок, а у меня что-то не получалось, хотя всяко пробовал. Так-то хорошая подборка инструментов. Чувствуется, что внимательно подошли к делу. Однако нет некоторых вещей, например Seek, что автору вроде как тоже необходимо.
Re: Работа с секторами USB FLASH памяти
Добавлено: 23 янв 2017, 15:48
CCCP33
dadreamer писал(а):
Хм. А какую-то ошибку выдаёт? У меня мою флэшку читает нормально. И локальные диски тоже. Можете попробовать вместо буквы диска указывать его номер:
\\.\PHYSICALDRIVE#, где
# - номер диска. Определить номер можно с помощью запроса в командной строке:
Ошибку не выдает. Выдает пустоту. Возможно дело в "многосекторности" операции чтения/записи? В мануале на девайс следующие слова:
Код: Выделить всё
В случае если чтение/запись указанного сектора производится «многосекторной» операцией, устройство игнорирует обращение.
Re: Работа с секторами USB FLASH памяти
Добавлено: 23 янв 2017, 16:22
dadreamer
CCCP33 писал(а):Выдает пустоту.
Так может там (на флэшке) по указанному адресу ничего и нет? Не может такого быть? Я полагаю, вы делали так, как у вас в первом сообщении написано? Хотя там нигде операция чтения не фигурирует. Даже не с чем сравнить. Если у вас есть возможность, попробуйте сравнить работу кода на С с работой кода на LV.
CCCP33 писал(а):Возможно дело в "многосекторности" операции чтения/записи?
Вряд ли. Через WinAPI мы работаем со всем диском, как он есть. Не важно, на сколько секторов он разбит. Смещение задаётся через Seek и число считываемых/записываемых байт.
Re: Работа с секторами USB FLASH памяти
Добавлено: 08 фев 2017, 16:46
CCCP33
Так может там (на флэшке) по указанному адресу ничего и нет?
Дело было в том, что пока строго не указал на 8 сектор - ничего не читалось/записывалось.
Blackman, dadreamer благодарю за участие. Девайс пашет. Но остались некоторые вопросы по входам функций DLL - см. картинку. Т.е. например GENERIC_READ =0x80000000, GENERIC_WRITE=0x40000000. Почему так?
P.S. конечно было бы лучше получить Refnum и работать с помощью функций LV, но, к сожалению, у меня не получилось так сделать..
Re: Работа с секторами USB FLASH памяти
Добавлено: 08 фев 2017, 17:46
dadreamer
CCCP33 писал(а):Но остались некоторые вопросы по входам функций DLL - см. картинку. Т.е. например GENERIC_READ =0x80000000, GENERIC_WRITE=0x40000000. Почему так?
Ну, все эти вещи описаны на MSDN, ссылку я уже приводил, но вот:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
GENERIC_READ + GENERIC_WRITE - получаем доступ к устройству для
чтения и записи (приём и отправка соответственно);
FILE_SHARE_READ + FILE_SHARE_WRITE - разрешаем совместный доступ к устройству для нескольких процессов (на чтение и на запись); кроме того, флаг FILE_SHARE_WRITE явно требуется при открытии тома (см. справку);
OPEN_EXISTING - открываем только существующее устройство; кроме того, флаг OPEN_EXISTING явно требуется при работе с дисками и томами.
Вообще, прочитайте хотя бы пункт
Physical Disks and Volumes, там всё это расписано.
CCCP33 писал(а):P.S. конечно было бы лучше получить Refnum и работать с помощью функций LV, но, к сожалению, у меня не получилось так сделать..
И не получится. Они не заточены на работу с дисками (хотя могли бы - можно создать идею на NI Idea Exchange). Возможно, есть какие-то ограничения для этого, хоть и используется тот же инструментарий ОС, по кр. мере на Windows.