C# LibUsbDotNet USBEndpointReader DataReceived事件未在我预期的时间触发

C# LibUsbDotNet USBEndpointReader DataReceived事件未在我预期的时间触发,c#,.net,usb,libusbdotnet,C#,.net,Usb,Libusbdotnet,我有一个USB设备,需要通过LibUsbDotNet从中读取数据 如果我在成功打开设备后使用以下代码 protected UsbEndpointReader _libUsbReader = null; protected UsbEndpointWriter _libUsbWriter = null; 并定义方法: private void OnDataReceived(object sender, EndpointDataEventArgs e) {

我有一个USB设备,需要通过LibUsbDotNet从中读取数据

如果我在成功打开设备后使用以下代码

    protected UsbEndpointReader _libUsbReader = null;
    protected UsbEndpointWriter _libUsbWriter = null;

并定义方法:

    private void OnDataReceived(object sender, EndpointDataEventArgs e)
    {
        Console.WriteLine("Data received");
    }
事件从不发生。我知道我的代码正在接收数据包,因为我连接了一个USB分析仪,可以看到它们进入

如果我更改代码以消除对事件回调的依赖,而是在后台线程上使用下面的循环来读取reader对象

while(true)
{
     ErrorCode ec = ErrorCode.None;
     Thread.Sleep(5);
     int bytesRead;
     byte[] buffer = new byte[32];
     ec = _libUsbReader.Read(buffer, 1000, out bytesRead); 
     if(bytesRead>0) Console.WriteLine("Data Received");
}
然后一切都很好

我试着玩弄我初始化的顺序、值等,但仍然没有得到任何乐趣。如果我使用DataReceived事件,有人能解释为什么没有触发事件吗

我正在使用LibUsbDotNet 2.2.8。

请这样尝试:

_libUsbReader.DataReceived += mEp_DataReceived;

private void mEp_DataReceived(object sender, EndpointDataEventArgs e) 
{
    try
    {
        Invoke(new OnDataReceivedDelegate(OnDataReceived), new object[] { sender, e });
    }
    catch
    {
        closeDevice();
    }
}

我知道这很古老,但在你的代码中:

...
_libUsbReader.DataReceivedEnabled = true;
_libUsbReader.DataReceived += OnDataReceived;
_libUsbReader.ReadThreadPriority = System.Threading.ThreadPriority.Highest;
_libUsbReader.ReadBufferSize = 32;
...
DataReceived
之后设置了
DataReceivedEnabled
(不确定这是否有区别)

此外,我不会更改线程优先级和
ReadBufferSize
。后者默认为4096。当数据到达时,事件的
EndpointDataEventArgs
参数具有
Count
属性和实际接收的字节数


希望这能有所帮助。

我认为解决办法是您应该在活动中阅读端点内容(或放弃它)。我也有同样的问题,只在控制台上打印我只输入了1次的消息。当我使用read命令在事件中处理端点上的数据时,问题似乎得到了解决。

打开端点进行读取时,应将端点类型定义为
interrupt
,否则不会触发
datareceive
事件。 (可选定义读取缓冲区的大小)

在代码中,只需修改此行:

_libUsbReader = PhysicalLibUSBDevice.OpenEndpointReader(LibUsbDotNet.Main.ReadEndpointID.Ep01, 64, EndpointType.Interrupt);

在我的试用期内,该活动可以启动,但不是每次都可以。你的while(真的)代码救了我,非常感谢。
_libUsbReader = PhysicalLibUSBDevice.OpenEndpointReader(LibUsbDotNet.Main.ReadEndpointID.Ep01, 64, EndpointType.Interrupt);