Работа с секторами USB FLASH памяти
-
- beginner
- Сообщения: 48
- Зарегистрирован: 06 май 2014, 10:30
- Версия LabVIEW: 2011, 2015
- Откуда: Vldr
- Благодарил (а): 1 раз
- Контактная информация:
Работа с секторами USB FLASH памяти
Добрый день, коллеги! Надеюсь на вашу помощь по следующей проблеме:
Имеется 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;
}
Имеется 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;
}
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с секторами USB FLASH памяти
CreateFile со-товарищи Например, что-то такоеCCCP33 писал(а):FL = fopen("\\\\.\\G:", "rb+"); [/b] // как также достучаться, чтобы работать с флешкой как с бинарником?}
Код: Выделить всё
hDevice = CreateFile(@"\.\G:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
-
- beginner
- Сообщения: 48
- Зарегистрирован: 06 май 2014, 10:30
- Версия LabVIEW: 2011, 2015
- Откуда: Vldr
- Благодарил (а): 1 раз
- Контактная информация:
Re: Работа с секторами USB FLASH памяти
Этот Handle можно как-то использовать при работе с функциями из File I/O Pallete?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с секторами USB FLASH памяти
Теоретически, да. В файловом менеджере есть вот такая функция:CCCP33 писал(а):Этот Handle можно как-то использовать при работе с функциями из File I/O Pallete?
FNewRefNum
Собственно, на вход ей надо подать путь к файлу и дескриптор, а она выдаст обычный refnum, которые далее можно в использовать. Остаётся только сконвертировать хэндл WinAPI в File *. Если будет время, попробую позднее выложить какой-нибудь пример. Вообще, если бы удалось "скормить" инструменту Open/Create/Replace File путь к диску (а не к файлу), и он бы не заругался, то дальше можно было бы спокойно юзать стандартые для работы с файлами (так как все они на Винде работают через WinAPI). Но, к сожалению, диски этот почему-то открывать не хочет.
Ну, или можете, как вариант, реализовать всю работу на стандартных ReadFile/WriteFile из арсенала ОС.
-
- beginner
- Сообщения: 48
- Зарегистрирован: 06 май 2014, 10:30
- Версия LabVIEW: 2011, 2015
- Откуда: Vldr
- Благодарил (а): 1 раз
- Контактная информация:
Re: Работа с секторами USB FLASH памяти
Был бы благодарен за пример. Пока не очень представляю как работать с файловым менеджером и его функциями в программе
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с секторами USB FLASH памяти
Вы этими диск не откроете. Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.Blackman писал(а):http://ftp.ni.com/pub/devzone/epd/win32fileiovis.zip
Ну, вот простейший пример бинарного чтения. По аналогии сделаете запись, получение/установку "курсора" и прочие вещи.CCCP33 писал(а):Был бы благодарен за пример. Пока не очень представляю как работать с файловым менеджером и его функциями в программе
-
- beginner
- Сообщения: 48
- Зарегистрирован: 06 май 2014, 10:30
- Версия LabVIEW: 2011, 2015
- Откуда: Vldr
- Благодарил (а): 1 раз
- Контактная информация:
Re: Работа с секторами USB FLASH памяти
а как же FNewRefNum? Используя пример c FNewRefNum Blackman'а не получилось получить refnum, чтобы работать с функциями File I/O Pallete.
P.S Пример почему то ничего не считывает с этой "флешки". Читаю 512*8 байт
P.S Пример почему то ничего не считывает с этой "флешки". Читаю 512*8 байт
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с секторами USB FLASH памяти
Забудьте. Используйте CreateFile -> Read/WriteFile -> CloseHandle.CCCP33 писал(а):а как же FNewRefNum? Используя пример c FNewRefNum Blackman'а не получилось получить refnum, чтобы работать с функциями File I/O Pallete.
P.S Пример почему то ничего не считывает с этой "флешки". Читаю 512*8 байт
Хм. А какую-то ошибку выдаёт? У меня мою флэшку читает нормально. И локальные диски тоже. Можете попробовать вместо буквы диска указывать его номер: \\.\PHYSICALDRIVE#, где # - номер диска. Определить номер можно с помощью запроса в командной строке:
Код: Выделить всё
wmic diskdrive list brief
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Работа с секторами USB FLASH памяти
???dadreamer писал(а):Вы этими диск не откроете. Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с секторами USB FLASH памяти
Ну ок, а у меня что-то не получалось, хотя всяко пробовал. Так-то хорошая подборка инструментов. Чувствуется, что внимательно подошли к делу. Однако нет некоторых вещей, например Seek, что автору вроде как тоже необходимо.Blackman писал(а):???dadreamer писал(а):Вы этими диск не откроете. Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.
-
- beginner
- Сообщения: 48
- Зарегистрирован: 06 май 2014, 10:30
- Версия LabVIEW: 2011, 2015
- Откуда: Vldr
- Благодарил (а): 1 раз
- Контактная информация:
Re: Работа с секторами USB FLASH памяти
Ошибку не выдает. Выдает пустоту. Возможно дело в "многосекторности" операции чтения/записи? В мануале на девайс следующие слова:dadreamer писал(а): Хм. А какую-то ошибку выдаёт? У меня мою флэшку читает нормально. И локальные диски тоже. Можете попробовать вместо буквы диска указывать его номер: \\.\PHYSICALDRIVE#, где # - номер диска. Определить номер можно с помощью запроса в командной строке:Код: Выделить всё
wmic diskdrive list brief
Код: Выделить всё
В случае если чтение/запись указанного сектора производится «многосекторной» операцией, устройство игнорирует обращение.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с секторами USB FLASH памяти
Так может там (на флэшке) по указанному адресу ничего и нет? Не может такого быть? Я полагаю, вы делали так, как у вас в первом сообщении написано? Хотя там нигде операция чтения не фигурирует. Даже не с чем сравнить. Если у вас есть возможность, попробуйте сравнить работу кода на С с работой кода на LV.CCCP33 писал(а):Выдает пустоту.
Вряд ли. Через WinAPI мы работаем со всем диском, как он есть. Не важно, на сколько секторов он разбит. Смещение задаётся через Seek и число считываемых/записываемых байт.CCCP33 писал(а):Возможно дело в "многосекторности" операции чтения/записи?
-
- beginner
- Сообщения: 48
- Зарегистрирован: 06 май 2014, 10:30
- Версия LabVIEW: 2011, 2015
- Откуда: Vldr
- Благодарил (а): 1 раз
- Контактная информация:
Re: Работа с секторами USB FLASH памяти
Дело было в том, что пока строго не указал на 8 сектор - ничего не читалось/записывалось.Так может там (на флэшке) по указанному адресу ничего и нет?
Blackman, dadreamer благодарю за участие. Девайс пашет. Но остались некоторые вопросы по входам функций DLL - см. картинку. Т.е. например GENERIC_READ =0x80000000, GENERIC_WRITE=0x40000000. Почему так?
P.S. конечно было бы лучше получить Refnum и работать с помощью функций LV, но, к сожалению, у меня не получилось так сделать..
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с секторами USB FLASH памяти
Ну, все эти вещи описаны на MSDN, ссылку я уже приводил, но вот: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspxCCCP33 писал(а):Но остались некоторые вопросы по входам функций DLL - см. картинку. Т.е. например GENERIC_READ =0x80000000, GENERIC_WRITE=0x40000000. Почему так?
GENERIC_READ + GENERIC_WRITE - получаем доступ к устройству для чтения и записи (приём и отправка соответственно);
FILE_SHARE_READ + FILE_SHARE_WRITE - разрешаем совместный доступ к устройству для нескольких процессов (на чтение и на запись); кроме того, флаг FILE_SHARE_WRITE явно требуется при открытии тома (см. справку);
OPEN_EXISTING - открываем только существующее устройство; кроме того, флаг OPEN_EXISTING явно требуется при работе с дисками и томами.
Вообще, прочитайте хотя бы пункт Physical Disks and Volumes, там всё это расписано.
И не получится. Они не заточены на работу с дисками (хотя могли бы - можно создать идею на NI Idea Exchange). Возможно, есть какие-то ограничения для этого, хоть и используется тот же инструментарий ОС, по кр. мере на Windows.CCCP33 писал(а):P.S. конечно было бы лучше получить Refnum и работать с помощью функций LV, но, к сожалению, у меня не получилось так сделать..
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 4 Ответы
- 621 Просмотры
-
Последнее сообщение Borjomy_1
-
- 4 Ответы
- 482 Просмотры
-
Последнее сообщение Eugene543210
-
- 4 Ответы
- 242 Просмотры
-
Последнее сообщение Embedder74
-
- 16 Ответы
- 3264 Просмотры
-
Последнее сообщение Artem.spb
-
- 4 Ответы
- 222 Просмотры
-
Последнее сообщение Andrew Lunev