USB HID (human interface device) class — это устройства с USB интерфейсом, разработанные для взаимодействие межу человеком и компьютером. К таким устройствам относятся клавиатуры, мышки, игровые джойстики, так же к таким устройствам можно отнести устройства на микроконтроллерах.
Большим преимуществом данного класса USB – это наличие огромного количество драйверов, что дает возможность повсеместно использовать именно этот класс, не привязываясь к конкретному устройству.
В языке C# есть несколько библиотек для работы с USB HID. На мой взгляд самой простой и удобной библиотекой является UsbLibrary.dll.
Работа с библиотекой UsbLibrary.dll. Подключение к проекту
Для начала работы с данной библиотекой в приложении C# необходимо добавить на нее ссылку в проект. Для этого в Обозревателе решений нажимаем правой клавишей мышки на поле Ссылки и в всплывающем меню нажимаем Добавить ссылку. Далее в появившемся окне нажимаем кнопку Обзор и выбираем файл UsbLibrary.dll. Нажимаем кнопку Ок и все, библиотека добавлена, теперь ее можно использовать в проекте C#.
Файл 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
Выбираем наше устройство и нажимаем правой клавишей мыши и в новом окне в пункте Сведения, необходимо выбрать ИД оборудования. Отображенные значения и будут наши PID и VID;
Ниже представлен код использования 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 для С#
Надо указывать версию Visual Studio, так как из моего опыта UsbLibrary.dll версиозависима.
Добрый день, спасибо за комментарий. Нет сейчас это не обязательно. Данную библиотеку я использовал в VS2017, VS2019, VS2022. Во всех студиях работает отлично. Так же тестировал на Windows7 и Windows10. Нигде проблем не наблюдалось.
В смысле, для каждой VS желательно иметь UsbLibrary, которая была откомпилирована в этой же VS. Раньше было так, сейчас не знаю.
Откуда скопировали? дайте ссылку. очень много непонятного.
Добрый день! Спрашивайте что вам не понятно, поможем разобраться.