C# LibUsbDotNet USBEndpointReader DataReceived事件未在我预期的时间触发
我有一个USB设备,需要通过LibUsbDotNet从中读取数据 如果我在成功打开设备后使用以下代码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) {
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);