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. Раньше было так, сейчас не знаю.
Откуда скопировали? дайте ссылку. очень много непонятного.
Добрый день! Спрашивайте что вам не понятно, поможем разобраться.