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

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы

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

Postby CCCP33 on 19 Jan 2017, 16:27

Добрый день, коллеги! Надеюсь на вашу помощь по следующей проблеме:
Имеется 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;
}
CCCP33
beginner
beginner
 
Posts: 18
Joined: 06 May 2014, 10:30
LabVIEW Version: 2011
Karma: 0

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

Postby dadreamer on 19 Jan 2017, 19:40

CCCP33 wrote:FL = fopen("\\\\.\\G:", "rb+"); [/b] // как также достучаться, чтобы работать с флешкой как с бинарником?}

CreateFile со-товарищи :wink: Например, что-то такое
Code: Select all
hDevice = CreateFile(@"\.\G:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
User avatar
dadreamer
professor
professor
 
Posts: 3102
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 782
I/O VIP vision internet

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

Postby CCCP33 on 20 Jan 2017, 15:44

Этот Handle можно как-то использовать при работе с функциями из File I/O Pallete?
CCCP33
beginner
beginner
 
Posts: 18
Joined: 06 May 2014, 10:30
LabVIEW Version: 2011
Karma: 0

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

Postby dadreamer on 20 Jan 2017, 15:57

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

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

Ну, или можете, как вариант, реализовать всю работу на стандартных ReadFile/WriteFile из арсенала ОС.
User avatar
dadreamer
professor
professor
 
Posts: 3102
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 782
I/O VIP vision internet

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

Postby CCCP33 on 20 Jan 2017, 16:21

Был бы благодарен за пример. Пока не очень представляю как работать с файловым менеджером и его функциями в программе
CCCP33
beginner
beginner
 
Posts: 18
Joined: 06 May 2014, 10:30
LabVIEW Version: 2011
Karma: 0

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

Postby Blackman on 20 Jan 2017, 18:21

Blackman
leader
leader
 
Posts: 761
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 217

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

Postby dadreamer on 20 Jan 2017, 19:46

Blackman wrote:http://ftp.ni.com/pub/devzone/epd/win32fileiovis.zip

Вы этими :vi: диск не откроете. :wink: Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.
CCCP33 wrote:Был бы благодарен за пример. Пока не очень представляю как работать с файловым менеджером и его функциями в программе

Ну, вот простейший пример бинарного чтения.
read_from_disk.rar
lv2011
(36.95 KiB) Downloaded 69 times
2017-01-20_21-28-27.jpg

По аналогии сделаете запись, получение/установку "курсора" и прочие вещи.
User avatar
dadreamer
professor
professor
 
Posts: 3102
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 782
I/O VIP vision internet

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

Postby CCCP33 on 20 Jan 2017, 20:25

а как же FNewRefNum? Используя пример c FNewRefNum Blackman'а не получилось получить refnum, чтобы работать с функциями File I/O Pallete.
P.S Пример почему то ничего не считывает с этой "флешки". Читаю 512*8 байт
CCCP33
beginner
beginner
 
Posts: 18
Joined: 06 May 2014, 10:30
LabVIEW Version: 2011
Karma: 0

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

Postby dadreamer on 20 Jan 2017, 21:02

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

Забудьте. Используйте CreateFile -> Read/WriteFile -> CloseHandle.

Хм. А какую-то ошибку выдаёт? У меня мою флэшку читает нормально. И локальные диски тоже. Можете попробовать вместо буквы диска указывать его номер: \\.\PHYSICALDRIVE#, где # - номер диска. Определить номер можно с помощью запроса в командной строке:
Code: Select all
wmic diskdrive list brief
User avatar
dadreamer
professor
professor
 
Posts: 3102
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 782
I/O VIP vision internet

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

Postby Blackman on 20 Jan 2017, 23:44

dadreamer wrote:Вы этими :vi: диск не откроете. :wink: Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.

??? :wink:
Attachments
Win32FIO_Read disk.png
Win32FIO_Read disk FP.png
Blackman
leader
leader
 
Posts: 761
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 217

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

Postby dadreamer on 21 Jan 2017, 00:05

Blackman wrote:
dadreamer wrote:Вы этими :vi: диск не откроете. :wink: Их нужно допиливать. Path Control не принимает пути вида \\.\девайс.

??? :wink:

Ну ок, а у меня что-то не получалось, хотя всяко пробовал. Так-то хорошая подборка инструментов. Чувствуется, что внимательно подошли к делу. Однако нет некоторых вещей, например Seek, что автору вроде как тоже необходимо.
User avatar
dadreamer
professor
professor
 
Posts: 3102
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 782
I/O VIP vision internet

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

Postby CCCP33 on 23 Jan 2017, 15:48

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

Ошибку не выдает. Выдает пустоту. Возможно дело в "многосекторности" операции чтения/записи? В мануале на девайс следующие слова:
Code: Select all
В случае если чтение/запись указанного сектора производится «многосекторной» операцией, устройство игнорирует обращение.
CCCP33
beginner
beginner
 
Posts: 18
Joined: 06 May 2014, 10:30
LabVIEW Version: 2011
Karma: 0

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

Postby dadreamer on 23 Jan 2017, 16:22

CCCP33 wrote:Выдает пустоту.

Так может там (на флэшке) по указанному адресу ничего и нет? Не может такого быть? Я полагаю, вы делали так, как у вас в первом сообщении написано? Хотя там нигде операция чтения не фигурирует. Даже не с чем сравнить. Если у вас есть возможность, попробуйте сравнить работу кода на С с работой кода на LV.
CCCP33 wrote:Возможно дело в "многосекторности" операции чтения/записи?

Вряд ли. Через WinAPI мы работаем со всем диском, как он есть. Не важно, на сколько секторов он разбит. Смещение задаётся через Seek и число считываемых/записываемых байт.
User avatar
dadreamer
professor
professor
 
Posts: 3102
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 782
I/O VIP vision internet

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

Postby CCCP33 on 08 Feb 2017, 16:46

Так может там (на флэшке) по указанному адресу ничего и нет?

Дело было в том, что пока строго не указал на 8 сектор - ничего не читалось/записывалось.
Blackman, dadreamer благодарю за участие. Девайс пашет. Но остались некоторые вопросы по входам функций DLL - см. картинку. Т.е. например GENERIC_READ =0x80000000, GENERIC_WRITE=0x40000000. Почему так?
P.S. конечно было бы лучше получить Refnum и работать с помощью функций LV, но, к сожалению, у меня не получилось так сделать..
Attachments
Снимок.JPG
Входы
CCCP33
beginner
beginner
 
Posts: 18
Joined: 06 May 2014, 10:30
LabVIEW Version: 2011
Karma: 0

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

Postby dadreamer on 08 Feb 2017, 17:46

CCCP33 wrote:Но остались некоторые вопросы по входам функций 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 wrote:P.S. конечно было бы лучше получить Refnum и работать с помощью функций LV, но, к сожалению, у меня не получилось так сделать..

И не получится. Они не заточены на работу с дисками (хотя могли бы - можно создать идею на NI Idea Exchange). Возможно, есть какие-то ограничения для этого, хоть и используется тот же инструментарий ОС, по кр. мере на Windows.
User avatar
dadreamer
professor
professor
 
Posts: 3102
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 782
I/O VIP vision internet

Next

Return to Коммуникация с приборами

Who is online

Users browsing this forum: No registered users and 5 guests

cron