USB HID 在 C# 中挂在 Read() 上

本文关键字:Read HID USB | 更新日期: 2023-09-27 18:31:29

我正在尝试连接到USB数字秤。当scale.IsConnected成真时,代码确实会连接到刻度,但它挂在 250 应该是以毫秒为单位的超时scale.Read(250),但它永远不会从 Read 返回。

我正在使用此线程中的代码,除了由于Mike O Brien的HID库的新版本而进行的更改:

public HidDevice[] GetDevices ()
{
    HidDevice[] hidDeviceList;
            
    // Metler Toledo
    hidDeviceList = HidDevices.Enumerate(0x0eb8).ToArray();
    if (hidDeviceList.Length > 0)
        return hidDeviceList;
    
    return hidDeviceList;
}
<小时 />

我设法让秤工作,看看迈克的答案

USB HID 在 C# 中挂在 Read() 上

这里

我设法让秤工作。在我的回调中,当 scale 返回数据时运行,我正在执行Read这是一个阻塞调用。

所以造成了一个死锁,我应该只使用ReadReportRead.看看迈克下面发布的例子。

using System;
using System.Linq;
using System.Text;
using HidLibrary;
namespace MagtekCardReader
{
    class Program
    {
        private const int VendorId = 0x0801;
        private const int ProductId = 0x0002;
        private static HidDevice _device;
        static void Main()
        {
            _device = HidDevices.Enumerate(VendorId, ProductId).FirstOrDefault();
            if (_device != null)
            {
                _device.OpenDevice();
                _device.Inserted += DeviceAttachedHandler;
                _device.Removed += DeviceRemovedHandler;
                _device.MonitorDeviceEvents = true;
                _device.ReadReport(OnReport);
                Console.WriteLine("Reader found, press any key to exit.");
                Console.ReadKey();
                _device.CloseDevice();
            }
            else
            {
                Console.WriteLine("Could not find reader.");
                Console.ReadKey();
            }
        }
        private static void OnReport(HidReport report)
        {
            if (!_device.IsConnected) {
                return;
            }
            var cardData = new Data(report.Data);
            Console.WriteLine(!cardData.Error ? Encoding.ASCII.GetString(cardData.CardData) : cardData.ErrorMessage);
            _device.ReadReport(OnReport);
        }
        private static void DeviceAttachedHandler()
        {
            Console.WriteLine("Device attached.");
            _device.ReadReport(OnReport);
        }
        private static void DeviceRemovedHandler()
        {
            Console.WriteLine("Device removed.");
        }
    }
}

我无法帮助您解决您的问题,但是不久前我不得不将脚踏开关集成到应用程序中,我发现这个USB HID C#库运行良好:

用于 C# 的 USB HID 组件

也许你应该试一试,因为它很容易集成。