Страница 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 со-товарищи :wink: Например, что-то такое

Код: Выделить всё

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?
Теоретически, да. В файловом менеджере :labview: есть вот такая функция:
FNewRefNum
Собственно, на вход ей надо подать путь к файлу и дескриптор, а она выдаст обычный refnum, которые далее можно в :labview: использовать. Остаётся только сконвертировать хэндл WinAPI в File *. Если будет время, попробую позднее выложить какой-нибудь пример. Вообще, если бы удалось "скормить" инструменту Open/Create/Replace File путь к диску (а не к файлу), и он бы не заругался, то дальше можно было бы спокойно юзать стандартые :vi: для работы с файлами (так как все они на Винде работают через WinAPI). Но, к сожалению, диски этот :vi: почему-то открывать не хочет.

Ну, или можете, как вариант, реализовать всю работу на стандартных 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
Вы этими :vi: диск не откроете. :wink: Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.
CCCP33 писал(а):Был бы благодарен за пример. Пока не очень представляю как работать с файловым менеджером и его функциями в программе
Ну, вот простейший пример бинарного чтения.
read_from_disk.rar
lv2011
(36.95 КБ) 175 скачиваний
2017-01-20_21-28-27.jpg
По аналогии сделаете запись, получение/установку "курсора" и прочие вещи.

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#, где # - номер диска. Определить номер можно с помощью запроса в командной строке:

Код: Выделить всё

wmic diskdrive list brief

Re: Работа с секторами USB FLASH памяти

Добавлено: 20 янв 2017, 23:44
Blackman
dadreamer писал(а):Вы этими :vi: диск не откроете. :wink: Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.
??? :wink:

Re: Работа с секторами USB FLASH памяти

Добавлено: 21 янв 2017, 00:05
dadreamer
Blackman писал(а):
dadreamer писал(а):Вы этими :vi: диск не откроете. :wink: Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.
??? :wink:
Ну ок, а у меня что-то не получалось, хотя всяко пробовал. Так-то хорошая подборка инструментов. Чувствуется, что внимательно подошли к делу. Однако нет некоторых вещей, например Seek, что автору вроде как тоже необходимо.

Re: Работа с секторами USB FLASH памяти

Добавлено: 23 янв 2017, 15:48
CCCP33
dadreamer писал(а): Хм. А какую-то ошибку выдаёт? У меня мою флэшку читает нормально. И локальные диски тоже. Можете попробовать вместо буквы диска указывать его номер: \\.\PHYSICALDRIVE#, где # - номер диска. Определить номер можно с помощью запроса в командной строке:

Код: Выделить всё

wmic diskdrive list brief
Ошибку не выдает. Выдает пустоту. Возможно дело в "многосекторности" операции чтения/записи? В мануале на девайс следующие слова:

Код: Выделить всё

В случае если чтение/запись указанного сектора производится «многосекторной» операцией, устройство игнорирует обращение.

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.