Работа с USB HID в C#

USB HID (human interface device) class — это устройства с USB интерфейсом, разработанные для взаимодействие межу человеком и компьютером. К таким устройствам относятся клавиатуры, мышки, игровые джойстики, так же к таким устройствам можно отнести устройства на микроконтроллерах.

Большим преимуществом данного класса USB  — это наличие огромного количество драйверов, что дает возможность повсеместно использовать именно этот класс, не привязываясь к конкретному устройству. 

В языке C# есть несколько библиотек для работы с USB HID. На мой взгляд самой простой и удобной библиотекой является UsbLibrary.dll.

Работа с библиотекой UsbLibrary.dll. Подключение к проекту

Для начала работы с данной библиотекой в приложении C# необходимо добавить на нее ссылку в проект. Для этого в Обозревателе решений нажимаем правой клавишей мышки на поле Ссылки и в всплывающем меню нажимаем Добавить ссылку. Далее в появившемся окне нажимаем кнопку Обзор и выбираем файл UsbLibrary.dll. Нажимаем кнопку Ок и все, библиотека добавлена, теперь ее можно использовать в проекте C#.

Рисунок 1. Добавление ссылки на библиотеку

Файл DLL библиотеки размещайте в каталоге программы, чтобы проще было ее переносить.

Работа с библиотекой UsbLibrary.dll. Пример кода C#

Для начала необходимо добавить библиотеку директивой using:

using UsbLibrary;

Далее объявляем переменную класса UsbHidPort.

UsbHidPort usb = new UsbHidPort();

Затем объявите переменные USBDevVendorID, USBDevProductID и присвойте им необходимые значения. Для моего устройства это 0x0045 и 0x1307. Так как я сам писал хост для устройства USB HID, то VID и PID указывал сам.

private static byte[] USBSend = new byte[65]; 
private UInt16 USBDevProductID = 0x0045; 
private UInt16 USBDevVendorID = 0x1307;

Если не известно какой VID и PID устройства то идем в диспетчер в раздел Устройства HID

Рисунок 2. Устройства HID в Диспетчере устройств

Выбираем наше устройство и нажимаем  правой клавишей мыши и в новом окне в пункте Сведения, необходимо выбрать ИД оборудования. Отображенные значения и будут наши PID и VID;

Рисунок 3. Свойства USB-устройства ввода

Ниже представлен код использования USB HID.

private void Form1_Load(object sender, EventArgs e)
{
   // переопределяем события класса USB HID
   // Событие на поключение устройства    
   usb.OnSpecifiedDeviceArrived += usb_OnSpecifiedDeviceArrived;
   // событие когда устройство отключается
   usb.OnSpecifiedDeviceRemoved += usb_OnSpecifiedDeviceRemoved;
   //событие на прием данных
   usb.OnDataRecieved += usb_OnDataRecieved;

   usb.ProductId = USBDevProductID;
   usb.VendorId = USBDevVendorID;
}

private void usb_OnSpecifiedDeviceArrived(object sender, EventArgs e)
{
   Connecting = true;
}

private void usb_OnSpecifiedDeviceRemoved(object sender, EventArgs e)
{
   Connecting = false;
}

Ниже представлен пример из реального работающего кода, по приему данных с устройства USB Hid. Суть такова: из программы на C# пользователь по таймеру отправляет команду  на HID устройство, функция OnDataRecieved  принимает данные, отправленные устройством. Если в данных не встречается строка «MESSAGE END» добавляем пакет данных в List data.

private void timWork_Tick(object sender, EventArgs e)
{
   int cell = 0;  // целое число
   int doubl = 0; // дробное число
   byte[] USB_Read = new byte[65];
   if (usb.Ready())
   {
      USBSend[1] = Convert.ToByte('p');                                      // обработать исключение
      this.usb.SpecifiedDevice.SendData(USBSend);
      while (EndMessege == 0) Application.DoEvents();
      if (EndMessege == 1)
      {
         // Если есть данные от прибора обрабатываем их и выводим график
         if (data.Count != 0)
         {
            USB_Read = data[0];
            cell = 0;  // целое число
            doubl = 0; // дробное число
                                                           
            cell = Combine(USB_Read[12], USB_Read[13]);
            list_SensorE.Add(list_SensorE.Count + 1, Convert.ToDouble(cell));

            // Если еденица то записываем в файл
            if (flagDateWrite == 1)
            {
               String DataWrite;
               DataWrite = list_SensorE[list_SensorE.Count - 1].ToString() 
               using (StreamWriter fstream = new StreamWriter("test.txt", true, Encoding.GetEncoding(1251)))
               {
                  // операции с fstream
                  fstream.WriteLine(DataWrite);
               }
            }
         }
         DrawGraf();
         Application.DoEvents(); // Чтобы программа не зависала;
         data.Clear();
         EndMessege = 0;
      }
   }
   Application.DoEvents(); // Чтобы программа не зависала;
}

private void usb_OnDataRecieved(object sender, UsbLibrary.DataRecievedEventArgs args)
{
   string tempstr = "";
   byte[] tempAr = new byte[64];
   byte[] UsbR = new byte[65];

   UsbR = args.data;
   j++;
   if (EndMessege == 0)
   {
      for (int i = 0; i <= tempAr.Length - 1; i++)
      {
         tempAr[i] = UsbR[i + 1];
      }
      temp = System.Text.Encoding.ASCII.GetString(tempAr);
      for (int i = 0; i <= 10; i++)
      {
         tempstr = tempstr + temp[i];
      }
      if (tempstr == "MESSAGE END")
         { EndMessege = 1; }
      else { data.Add(tempAr); }
   }            
}

Скачать библиотеку UsbLibrary для С#

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
3 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Николай
Николай
6 месяцев назад

Надо указывать версию Visual Studio, так как из моего опыта UsbLibrary.dll версиозависима.

Николай
Николай
6 месяцев назад

В смысле, для каждой VS желательно иметь UsbLibrary, которая была откомпилирована в этой же VS. Раньше было так, сейчас не знаю.