问题标签 [winusb]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
923 浏览

c# - WinUsb_ReadPipe Return False and Timeout

I have to convert an application from C++(a working one) to C#. However, in the newly C# codes, I fail to read the data using WinUsb_ReadPipe, despite successfully in other operation such WinUsb_GetDescriptor, WinUsb_QueryDeviceInformation, WinUsb_Initialize, WinUsb_WritePipe.

In the WinUsb_SetPipePolicy (Read) I have set,

  • Raw_IO = true
  • AUTO_CLEAR_STALL = True
  • TRANSFER_TIMEOUT = 1000 //1s

While for the WinUsb_SetPipePolicy (Write) I only set the TRANSFER_TIMEOUT = 1000.

When I execute the WinUsb_ReadPipe, the transaction FAIL and the Last error is 121 (ERROR_SEM_TIMEOUT).

This is the codes I used to read the pipe.

Once The code is executed, I get

  • isSuccess = FALSE
  • bytesReaded = 0
0 投票
0 回答
182 浏览

windows - 标准 USB 设备能否使用 WinUSB 建立通信

这似乎是一个令人难以置信的故事。请帮忙。我想开发一个 Windows 工具来与 HID 设备通信。但是,我无法修改 HID 设备使用表(报告描述符是固定的)。现在,我需要将供应商定义的命令(未包含在设备使用表中)发送到 USB 设备。HID 设备有特定的 API(设置功能、获取功能等)。但是,似乎无法发送不在使用表中的命令。我怀疑在这种情况下 WinUsb 是否可以提供帮助。主要问题是——我找到的每篇文章都是创建一个新的驱动程序(.INF)。如果我的 USB 设备仍然使用 HID 驱动程序,WinUSB 是否正常工作?

提前谢谢大家。

0 投票
0 回答
111 浏览

c++ - winUSB 应用程序 DbgengRemoteCommand 缺失

我开始对 USB 设备的访问进行编程,就像 arduino 一样。我为此使用了winUSB,并且我刚刚完成了每一步的安装。所以我想启动一个 USB 应用程序模板,但是发生了一个错误,说 DbgengRemoteCommand 丢失或为空。我真的不知道该怎么办。

感谢您的帮助。

0 投票
1 回答
940 浏览

c++ - 出现错误 87,SetupDiGetDeviceInterfaceDetail 的参数不正确

我在调用 SetupDiGetDeviceInterfaceDetail ( https://msdn.microsoft.com/en-us/library/ff551120.aspx )时不断收到 Windows 错误 87,即使将所有可选参数都切换为 NULL,我也会收到错误消息,但是我在另一个有效的函数中使用了前两个参数,所以我不明白它们有什么不正确的地方。

我真的不知道哪个参数可能不正确,因为前面的所有函数都返回 true(例如 GUID 是有效的)。

0 投票
0 回答
790 浏览

c++ - 通过 WinUsb 写入 USB 设备

最后更新 :

现在我有一个与我的设备兼容的字符串(它必须采用特定格式的不可打印字节),但是是一个无限循环。该程序永远不会退出 WinUsb_WritePipe。

原始问题:

在初始化我所有的 WinUsb 接口之后(正如这个做得很好的 MSDN 教程中所精确的那样:https ://msdn.microsoft.com/en-us/library/windows/hardware/ff540174(v=vs.85).aspx )

除了最后一步,我得到了一切顺利的设置并发送 true 没有错误。

(devInfo 是一个自定义对象,包含 aWINUSB_INTERFACE_HANDLE和在PipeId设备上写入所需的内容)

它打印

但是对于最后一步,即编写:

我已经尝试了所有可能的 PipeId(从 0 到 255,因为它在一个字节上),但仍然得到相同的错误。 WinUsb_WritePipe MSDN 文档没有说明错误 87。

0 投票
1 回答
194 浏览

windows - 为什么我无法从 WinUsb_ReadIsochPipeAsap 获得全部带宽?

我一次有多个WinUsb_ReadIsochPipeAsap飞行,并且总是在第一个成功后立即排队下一个WinUsb_GetOverlappedResult。根据文档

WinUsb_ReadIsochPipeAsap 允许 USB 驱动程序堆栈选择传输的起始帧号。如果端点上已经有一个或多个传输处于待处理状态,则传输将被安排为紧跟在当前最后一个待处理传输的最后一个帧号之后的帧号

(重点补充)

当我测量主机上的数据速率(读取完成率)时,我只看到 6ms 的轮询速率(每 6 帧),即使描述符bInterval1,并且 6ms 甚至不是同步端点的可能轮询间隔. 该文档让我认为我应该在每一帧上看到一次传输,因为我总是有多个待处理的传输。

如果我用 USB 分析器查看总线,我看不到任何IN-NAK设备,所以我怀疑 Windows 甚至没有发出请求。

为什么我看不到完整的 1000Hz 传输速率?

0 投票
1 回答
258 浏览

c++ - WinUsb_WritePipe 进入无限循环

我正在使用WinUsb_WritePipe 函数在 USB 设备上写入数据。

唯一的问题是该函数执行了无限循环。

这个函数曾经返回 false,但现在它什么都不返回。

0 投票
0 回答
208 浏览

windows-7 - 如何在 Windows 中过滤用于特定供应商或设备 ID 的 USB 设备?

我想通过只允许特定的 USB 供应商或设备 ID 来限制 Windows 7 机器上的 USB 端口。我没有管理一组计算机,所以我不想使用组策略或某事。像那样.. 我只想拒绝所有 USB 设备用于机器上的所有用户,除了我想根据他们的供应商或产品 ID 允许的某些 USB 设备。谢谢

0 投票
1 回答
224 浏览

usb - OSX 和 Windows 10 上的低延迟同步输出

我正在尝试通过高速 USB 2 以非常低的延迟输出同步数据(以编程方式生成)。理想情况下约为 1-2 毫秒。在 Windows 上我使用 WinUsb,在 OSX 上我使用 IOKit。

我想到了两种方法。我想知道哪个最好。

1 帧传输

WinUsb 在它允许的范围内非常严格,并且要求每个同步传输是整数帧(1 帧 = 1 毫秒)。因此,为了最大限度地减少延迟,请在循环中使用一帧的传输,如下所示:

这工作得相当好,并给出了 2 毫秒的延迟。在 OSX 上我可以做类似的事情,虽然它有点复杂。这是代码的要点 - 完整代码太长,无法在此处发布:

再次这种工作并给出大约 3.5 毫秒的延迟。但它不是超级可靠的。

与内核竞赛

OSX 的低延迟同步函数允许您提交长传输(例如 64 帧),然后定期(每毫秒最多一次)更新帧列表,该列表说明内核在读取写入缓冲区时必须到达的位置。

我认为这个想法是你以某种方式每 N 毫秒(或微秒)醒来,读取帧列表,找出你需要写入的位置并执行此操作。我还没有为此编写代码,但我不完全确定如何进行,而且我找不到任何示例。

更新帧列表时似乎没有提供回调,所以我想您必须使用自己的计时器 -CFRunLoopTimerCreate()并从该回调中读取帧列表?

另外我想知道 WinUsb 是否允许类似的事情,因为它还强制您注册一个缓冲区,以便内核和用户空间可以同时访问它。我找不到任何明确说明您可以在内核读取缓冲区时写入缓冲区的示例。您是否打算WinUsb_GetCurrentFrameNumber在常规回调中使用来确定内核在传输中必须到达的位置?

这需要在 Windows 上定期回调,这似乎有点棘手。我见过的唯一方法是使用最短周期为 1 毫秒的多媒体计时器NtSetTimerResolution(除非您使用未记录的( ?)。

所以我的问题是:我可以改进“1 帧传输”方法,还是应该切换到尝试与内核竞争的 1 kHz 回调。示例代码非常感谢!

0 投票
1 回答
241 浏览

c# - WinUsb:写入 OUT 管道会导致 IN 管道中的数据损坏

这是我第一个使用 WinUsb 驱动程序和库的项目。

我的主机运行 WINDOWS 10,安装了所有更新。
我的高速设备运行三个数据端点:

  • OUT 命令端点:主机使用它来发送命令
  • IN回复端点:主机接收每个命令的回复
  • IN Stream 端点:设备发送流数据,1600 字节,周期为 10 毫秒。

在 Host 应用程序中,有两个相关线程:

  • 命令线程向命令管道发送命令并从回复管道接收回复
  • Stream 线程从 Stream 管道收集数据

非等待函数用于所有管道。

如果另一个线程被挂起,每个线程都可以完美运行。
但是,如果两个线程同时工作,则流数据会在任意点出现损坏。

更多分析揭示了以下事实:

  • 损坏表现为连续的错误字节序列。错误序列的长度大致对应于命令和回复的长度。
  • 错误的序列从与数据包边界无关的任意点开始。
  • 错误的字节可能不同;有时,它们都是零,有时它们看起来像垃圾。
  • 时间分析表明,一旦命令发送到命令管道,就会发生损坏。

如果我实现线程之间的同步,效果就消失了,这样读/写操作在时间上是分开的。但是,这是不可接受的解决方案,我希望两个线程异步工作。
有没有人遇到过这样的影响?