Работа с 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 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Николай
Николай
17 дней назад

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

Николай
Николай
17 дней назад

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