簡體   English   中英

我期望LibUsbDotNet USBEndpointReader DataReceived事件未觸發

[英]LibUsbDotNet USBEndpointReader DataReceived event is not firing when I expect it to

我有一個USB設備,需要通過LibUsbDotNet讀取數據。

成功打開設備后,如果使用以下代碼...

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

        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;

並定義方法:

    private void OnDataReceived(object sender, EndpointDataEventArgs e)
    {
        Console.WriteLine("Data received");
    }

該事件永遠不會觸發。 我知道我的代碼正在接收數據包,因為我已經連接了USB分析儀,並且可以看到它們進入了。

如果我更改代碼以消除對事件回調的依賴,而是在后台線程上使用下面的循環讀取讀取器對象

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;
...

我在DataReceivedEnabled之后設置了DataReceived (不確定是否會有所不同)。

另外,我不更改線程優先級和ReadBufferSize 后者默認為4096。 數據到達時,事件的EndpointDataEventArgs參數具有Count屬性,其中包含接收到的實際字節數。

希望這可以幫助。

當打開端點進行讀取時,應將端點類型定義為interrupt ,否則不會觸發Datarecieve事件。 (可選地定義讀取緩沖區的大小)

在您的代碼中,您只需要修改以下行:

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

我認為解決方案是您應該在事件中讀取端點內容(或丟棄它)。 我有同樣的問題,當僅在控制台上打印時,我只輸入了1次消息。 當我使用read命令處理端點上的數據時,該問題似乎已解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM