Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2013, 02:26   #1
Xpressive
 
Регистрация: 16.04.2013
Сообщений: 3
Восклицание c# USB кнопка

Здравствуйте. Пишу довольно необычную курсовую, у меня есть USB кнопка(при подключении отображается как HID устройство) и мне нужно сделать так, чтобы при нажатии на нее выполнялись определенные действия... То есть в моем понимании мне нужен event нажатия на эту кнопку, как например button в WinForms. Для этого я нашел 2 библиотеки на С# для работы с USB устройствами, это HID USB Libary, и ее более сокращенная версия: (http://microsin.net/programming/PC/h...et-csharp.html) . С первой у меня вообще ничего не вышло, я даже не смог загнать Vendor ID и Product ID, так библиотека просит их в виде int, а на моей кнопке помимо цифр в ID есть и буквы. Со второй библиотекой я смог написать лишь пару строк и дальше не представляю как писать event(по ссылке выше есть примеры кода лишь на VisualBasic и скопипастить event оттуда не удалось).
Вот та пара написанных мною строк:

USBHIDDRIVER.USBInterface UsbButton = new USBInterface("vid_1D34", "pid_000D");
UsbButton.Connect();

Так же не совсем понимаю как должна вести себя программа при отсоединении кнопки и ее дальнейшем присоединении...В статье(ссылка выше) есть явный намек что она этого делать не умеет, либо я просто не понял этого момента) Привожу цитату:

"В Интернете можно найти очень похожий аналог библиотеки, описанной в этой статье, только не в виде DLL, а в виде файлов исходного кода C# (модулей .cs) [3]. Библиотека имеет класс UsbLibrary.UsbHidPort, в котором сосредоточен весь интерфейс работы с устройством USB HID. Возможностей у этой библиотеки больше - например, есть очень удобные события подключения и отключения устройства USB, благодаря чему легко реализовать прозрачную работу с устройством USB HID и восстанавливать обмен данными с USB-устройством без необходимости перезапуска программы."

Заранее благодарю за помощь.
Xpressive вне форума Ответить с цитированием
Старый 16.04.2013, 07:52   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

0x1D34
x0d
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.04.2013, 13:44   #3
Xpressive
 
Регистрация: 16.04.2013
Сообщений: 3
По умолчанию

Попробую немного упростить вопрос) Во второй библиотеке есть описание события, которе мне кажется нужно:
public void enableUsbBufferEvent(System.EventHa ndler eHandler)
Член USBHIDDRIVER.USBInterface

Как его правильно записать и куда??
Xpressive вне форума Ответить с цитированием
Старый 16.04.2013, 14:21   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...попробую немного 'упростить' (расширить) ответ: вы жаловались, что у вас не получается загнать в микросиновскую либу идентификаторы вашего устройства, ибо она требует в int-формате, а ваши идентификаторы содержат и символы. Так вот - ваш идентификатор записан в hex-формате и записывать нужно без указания 'vid_' or 'pid_', а просто запись самих значений идентификаторов либо в hex в виде 0x (для СИ), $ для Delphi, так как я уже подсказал выше. Ферштеен?

Что касаемо работы с HID-устройствами, то с ними я вообще работаю через вызовы SetupAPI над системным драйвером hid, впрочем и проект JEDI или микросиновская или LUFA-либа тоже подойдут. Удачи.

======================
...что касаемо отработки потери соединения-связи при физическом отсоединении устройства и дальнейшем его присоединении. Лично я использую скан ветки usb-устройств (опять же, SetupAPI), при отсутствии делается закрытие файла (с устройством работаем через CreateFile) и при появлении гаджета, делаем коннект.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 16.04.2013 в 14:28.
raxp вне форума Ответить с цитированием
Старый 16.04.2013, 14:37   #5
Xpressive
 
Регистрация: 16.04.2013
Сообщений: 3
По умолчанию

В микросиновской либе есть пример:
USBHIDDRIVER.USBInterface usb = new USBInterface("vid_06ba", "pid_5346");
То есть насколько я понял им нужно давать VID и PID именно в виде string, а не в int и hex) Вот насчет первой либы ваш совет может оказаться ценным, благодарю. Также вы не могли бы привести ваш код (пусть даже на другом языке) для примера?
Xpressive вне форума Ответить с цитированием
Старый 16.04.2013, 22:14   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Сообщение от Xpressive
В микросиновской либе есть пример:
USBHIDDRIVER.USBInterface usb = new USBInterface("vid_06ba", "pid_5346");
То есть насколько я понял им нужно давать VID и PID именно в виде string, а не в int и hex). Вот насчет первой либы ваш совет может оказаться ценным, благодарю
вот ваш первый пост:
Цитата:
Сообщение от Xpressive
С первой у меня вообще ничего не вышло, я даже не смог загнать Vendor ID и Product ID, так библиотека просит их в виде int, а на моей кнопке помимо цифр в ID есть и буквы.
какие еще могут быть вопросы и недопонимания?

Чтение с HID через HID Library:
Код:
procedure Ontmr2(uTimerID, uMessage: uint;dwUser, dw1, dw2: dword) stdcall;
const koef= -3; // коррекция температуры датчика USB.HID
var _gl_temp, i: integer;
    s, temp: string;
    // параметры считывания USB.HID
    z: integer;
    k: longword;
    raw: array [0..7] of Byte;
    written: cardinal;
begin
  // альтернатива считыванию данных с датчика через ReadFile()
  // введена для устранения загрузки процессора
  if assigned(dev) then begin
   dev.ReadFile(raw, 4, Written);
   k:= 0; z:= Written-1;
   while z>0 do begin
    k:= (k shl 8)or raw[z];
    z:= z-1
   end;

   // перевод показаний в градусы Цельсия + коррекция
   z:= k - 273 + koef;
   // проверка условия на нуль
   if (z<>-273+koef) then gl_temp:= strpas(z)
  end;
Использование либы LibUSB0 (она универсальная обертка, может и с USB_CLASS_HID) из http://microsin.ru/content/view/757/44/:
Код:
const
  LIBUSB_PATH_MAX = 512;
  LIBUSB_DLL_NAME =  'libusb0.dll';

procedure usb_init; cdecl; external LIBUSB_DLL_NAME name 'usb_init';

...


procedure SendUSBControlMessage(direction: BYTE; request, value, index, buflen: integer;var buffer: array of char);
var
  handle: Pusb_dev_handle;
  i: integer;
  USBDEV_SHARED_VENDOR:integer;
  USBDEV_SHARED_PRODUCT:integer;
  Product:PANSIChar;
  Vendor:PANSIChar;
begin
  USBDEV_SHARED_VENDOR:= $207;
  USBDEV_SHARED_PRODUCT:= $02D;
  Product:= 'MY';
  Vendor:= 'USB';

  usb_init();
  if (usbOpenDevice(handle, USBDEV_SHARED_VENDOR, Vendor, USBDEV_SHARED_PRODUCT, Product) <> 0) then
  begin
    raise Exception.Create(Format(
       'Could not find USB device "'+Product+'" with vid=$%x and pid=$%x !',
          [USBDEV_SHARED_VENDOR, USBDEV_SHARED_PRODUCT]));
        exit;
    end;
  usb_control_msg(handle, USB_TYPE_VENDOR or USB_RECIP_DEVICE or direction, request, value, index, buffer, sizeof(buffer), 5000);
  usb_close(handle);
end;



...
var
   data: array [0..2] of char; //AVR sends back max 3 bytes
begin
  SendUSBControlMessage(USB2PC,RQ_IO_READ, 0, aPORTA, 0, data);
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 05.11.2014, 20:15   #7
alex6441611
 
Регистрация: 06.04.2014
Сообщений: 3
По умолчанию

Здравствуйте! подскажите, с помощью библиотеки Lufa было реализовано стандартное устройство GenericHID. На программу пытаюсь написать с помощью библиотеки USBLibraryC#. На основе этой библ. еще написана программка Sniffer, в этой программе у меня получается передавать и принимать данные. Но вот меня смущает то, что при нажатии кнопки Ок начинается непрерывный прием данных, который длится все время пока устройство подключено к ПК. Такое может быть из-за того что конечные точки типа Interrupt? Если менять параметр конечной точки, кот именуется PollingIntervalMS, то сразу становится заметно изменение частоты вывода принятых данных в сниффере. Как думаете надо сделать другой тип конечной точки? Я попытался еще порыться в исходниках программы Sniffer чтоб найти методы передачи и отправки данных, но так ничего и не нашел. Полазив по форумам нашел как отправить данные микроконтроллеру
Код:
//Определяем USB устройство (oDev) назначив VID/PID
            var USBDevice = UsbLibrary.SpecifiedDevice.FindSpecifiedDevice(0x16c0, 0x5df);
 
            if (USBDevice != null)
            {
                //Вызываем функцию отправки 2-х байтов (SendData) нашему устройству (oDev: USBDevise) и возрщаем False/True
                var Senddata = new UsbLibrary.SpecifiedOutputReport(USBDevice).SendData(new byte[] { 1, 1 });
                USBDevice.SendData(new byte[] { 1, 1 });
                MessageBox.Show(Convert.ToString(Senddata)); //Выводим строчку возвращённого значения False/True
            }
            else
            {
                MessageBox.Show("Устройство не найдено");
            }
в принципе здесь пока все работает, но вот как принять данные вообще не могу понять. Подскажите что можете, заранее спасибо! во вложенных файлах библиотека и сниффер
Вложения
Тип файла: zip usb_hid.zip (268.5 Кб, 41 просмотров)
alex6441611 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно ли соединить 2 компа кабелем USB-USB? Ghost3 Компьютерное железо 21 06.08.2014 09:22
Кнопка Vetaluy Microsoft Office Excel 2 17.05.2011 00:03
кнопка prostac Помощь студентам 2 23.09.2010 20:31
mini USB на USB viks1 Компьютерное железо 5 07.12.2009 23:31