在業界你這樣的描述,一般會優先建議你檢查接地。
通訊最大的問題來自於干擾。
我們依賴 winusb 透過控制傳輸來處理與我們專有的 DFU 設備的通訊。每當我執行單一獨立的指令,例如 DFU_CLRSTATUS 或 DFU_GETSTATUS 時,硬體反應完美無瑕。但一旦我嘗試連續執行多個指令,惡夢就開始了。如果我嘗試清除狀態然後立即取得狀態,交易就會完全失敗,後續呼叫只會回傳 TransferBufferLength=0。更令人抓狂的是,無論安裝的是 Win 10 還是 Win 11,這個故障只會在大樓裡少數幾台隨機的工作站上出現。請幫幫我!
根据您的描述,单个 DFU 命令(如 DFU_CLRSTATUS 或 DFU_GETSTATUS)可以正常工作,但将它们连续执行时会导致传输失败,随后调用返回 TransferBufferLength=0。由于该问题只出现在少数随机的 Windows 10/11 工作站上,这表明问题不仅仅在于您的代码,还可能与驱动程序堆栈或 USB 控制器的行为差异有关。
一个常见原因是时序问题:WinUSB 在处理连续的控制传输时并不总是稳定,尤其是在设备固件期望命令之间存在短暂延迟的情况下。在发送下一个命令之前增加短暂等待,或检查前一个命令的完成状态,通常可以让流程更加稳定。另一个因素是驱动或芯片组差异,一些 USB 主控制器对时序要求更严格,这也解释了为什么只有部分电脑会出现该问题。
同时,建议确认所有受影响的机器都已安装最新的 Windows 更新以及 WinUSB.sys 版本,因为旧版本在控制传输方面存在已知问题。使用更大的缓冲区运行 DFU 流程,或者在传输失败后显式重置管道(pipe),也有助于从 TransferBufferLength=0 的状态中恢复。如果问题仍然存在,您可以使用 USBPcap 等工具记录 USB 跟踪日志,以确认问题发生在主机端还是设备端。
希望以上回复能为您提供一些有用的思路。如果这些信息解决了您的问题,请考虑将其标记为“接受答案”,以便其他遇到相同问题的用户更容易找到解决方案。如果您需要进一步的帮助,欢迎随时留言。
Jason