首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LibUsbDotNet USBEndpointReader DataReceived事件未按预期触发

LibUsbDotNet USBEndpointReader DataReceived事件未按预期触发
EN

Stack Overflow用户
提问于 2014-05-13 00:07:55
回答 4查看 2K关注 0票数 1

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

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

代码语言:javascript
复制
    protected UsbEndpointReader _libUsbReader = null;
    protected UsbEndpointWriter _libUsbWriter = null;

代码语言:javascript
复制
        IUsbDevice wholeUsbDevice = PhysicalLibUSBDevice as IUsbDevice;
        if (!ReferenceEquals(wholeUsbDevice, null))
        {
            // This is a "whole" USB device. Before it can be used, 
            // the desired configuration and interface must be selected.

            // Select config #1
            wholeUsbDevice.SetConfiguration(1);

            // Claim interface #0.
            wholeUsbDevice.ClaimInterface(0);
        }


        // Create the reader and writer streams
        _libUsbReader = PhysicalLibUSBDevice.OpenEndpointReader(LibUsbDotNet.Main.ReadEndpointID.Ep01);
        _libUsbWriter = PhysicalLibUSBDevice.OpenEndpointWriter(LibUsbDotNet.Main.WriteEndpointID.Ep02);

        _libUsbReader.DataReceivedEnabled = true;
        _libUsbReader.DataReceived += OnDataReceived;
        _libUsbReader.ReadThreadPriority = System.Threading.ThreadPriority.Highest;
        _libUsbReader.ReadBufferSize = 32;

并定义方法:

代码语言:javascript
复制
    private void OnDataReceived(object sender, EndpointDataEventArgs e)
    {
        Console.WriteLine("Data received");
    }

该事件永远不会触发。我知道我的代码正在接收数据包,因为我连接了一个USB分析器,可以看到它们进来。

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

代码语言:javascript
复制
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");
}

那么一切都会很顺利。

我试了试我初始化的顺序,值等等,仍然得不到joy。如果我使用DataReceived事件,谁能告诉我为什么事件不会触发?

我使用的是LibUsbDotNet 2.2.8。

EN

回答 4

Stack Overflow用户

发布于 2016-05-20 05:57:40

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

代码语言:javascript
复制
...
_libUsbReader.DataReceivedEnabled = true;
_libUsbReader.DataReceived += OnDataReceived;
_libUsbReader.ReadThreadPriority = System.Threading.ThreadPriority.Highest;
_libUsbReader.ReadBufferSize = 32;
...

我在DataReceived之后设置了DataReceivedEnabled (不确定这是否有区别)。

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

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2014-10-03 14:48:33

请这样尝试:

代码语言:javascript
复制
_libUsbReader.DataReceived += mEp_DataReceived;

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

Stack Overflow用户

发布于 2017-11-28 21:58:25

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

在你的代码中,你只需要修改下面这一行:

代码语言:javascript
复制
_libUsbReader = PhysicalLibUSBDevice.OpenEndpointReader(LibUsbDotNet.Main.ReadEndpointID.Ep01, 64, EndpointType.Interrupt);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23613818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档