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

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
CCCP33
beginner
beginner
Сообщения: 48
Зарегистрирован: 06 май 2014, 10:30
Версия LabVIEW: 2011, 2015
Откуда: Vldr
Благодарил (а): 1 раз
Контактная информация:

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

Сообщение 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;
}
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение 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);
CCCP33
beginner
beginner
Сообщения: 48
Зарегистрирован: 06 май 2014, 10:30
Версия LabVIEW: 2011, 2015
Откуда: Vldr
Благодарил (а): 1 раз
Контактная информация:

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

Сообщение CCCP33 »

Этот Handle можно как-то использовать при работе с функциями из File I/O Pallete?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

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

Ну, или можете, как вариант, реализовать всю работу на стандартных ReadFile/WriteFile из арсенала ОС.
CCCP33
beginner
beginner
Сообщения: 48
Зарегистрирован: 06 май 2014, 10:30
Версия LabVIEW: 2011, 2015
Откуда: Vldr
Благодарил (а): 1 раз
Контактная информация:

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

Сообщение CCCP33 »

Был бы благодарен за пример. Пока не очень представляю как работать с файловым менеджером и его функциями в программе
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

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

Сообщение Blackman »

Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

Вы этими :vi: диск не откроете. :wink: Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.
CCCP33 писал(а):Был бы благодарен за пример. Пока не очень представляю как работать с файловым менеджером и его функциями в программе
Ну, вот простейший пример бинарного чтения.
read_from_disk.rar
lv2011
(36.95 КБ) 175 скачиваний
2017-01-20_21-28-27.jpg
По аналогии сделаете запись, получение/установку "курсора" и прочие вещи.
CCCP33
beginner
beginner
Сообщения: 48
Зарегистрирован: 06 май 2014, 10:30
Версия LabVIEW: 2011, 2015
Откуда: Vldr
Благодарил (а): 1 раз
Контактная информация:

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

Сообщение CCCP33 »

а как же FNewRefNum? Используя пример c FNewRefNum Blackman'а не получилось получить refnum, чтобы работать с функциями File I/O Pallete.
P.S Пример почему то ничего не считывает с этой "флешки". Читаю 512*8 байт
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

CCCP33 писал(а):а как же FNewRefNum? Используя пример c FNewRefNum Blackman'а не получилось получить refnum, чтобы работать с функциями File I/O Pallete.
P.S Пример почему то ничего не считывает с этой "флешки". Читаю 512*8 байт
Забудьте. Используйте CreateFile -> Read/WriteFile -> CloseHandle.

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

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

wmic diskdrive list brief
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

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

Сообщение Blackman »

dadreamer писал(а):Вы этими :vi: диск не откроете. :wink: Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.
??? :wink:
Вложения
Win32FIO_Read disk.png
Win32FIO_Read disk FP.png
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

Blackman писал(а):
dadreamer писал(а):Вы этими :vi: диск не откроете. :wink: Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.
??? :wink:
Ну ок, а у меня что-то не получалось, хотя всяко пробовал. Так-то хорошая подборка инструментов. Чувствуется, что внимательно подошли к делу. Однако нет некоторых вещей, например Seek, что автору вроде как тоже необходимо.
CCCP33
beginner
beginner
Сообщения: 48
Зарегистрирован: 06 май 2014, 10:30
Версия LabVIEW: 2011, 2015
Откуда: Vldr
Благодарил (а): 1 раз
Контактная информация:

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

Сообщение CCCP33 »

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

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

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

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

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

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

CCCP33 писал(а):Выдает пустоту.
Так может там (на флэшке) по указанному адресу ничего и нет? Не может такого быть? Я полагаю, вы делали так, как у вас в первом сообщении написано? Хотя там нигде операция чтения не фигурирует. Даже не с чем сравнить. Если у вас есть возможность, попробуйте сравнить работу кода на С с работой кода на LV.
CCCP33 писал(а):Возможно дело в "многосекторности" операции чтения/записи?
Вряд ли. Через WinAPI мы работаем со всем диском, как он есть. Не важно, на сколько секторов он разбит. Смещение задаётся через Seek и число считываемых/записываемых байт.
CCCP33
beginner
beginner
Сообщения: 48
Зарегистрирован: 06 май 2014, 10:30
Версия LabVIEW: 2011, 2015
Откуда: Vldr
Благодарил (а): 1 раз
Контактная информация:

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

Сообщение CCCP33 »

Так может там (на флэшке) по указанному адресу ничего и нет?
Дело было в том, что пока строго не указал на 8 сектор - ничего не читалось/записывалось.
Blackman, dadreamer благодарю за участие. Девайс пашет. Но остались некоторые вопросы по входам функций DLL - см. картинку. Т.е. например GENERIC_READ =0x80000000, GENERIC_WRITE=0x40000000. Почему так?
P.S. конечно было бы лучше получить Refnum и работать с помощью функций LV, но, к сожалению, у меня не получилось так сделать..
Вложения
Входы
Входы
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение 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.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приборами»