【问题标题】:Cannot communicate successfully with USB HID device using writefile()无法使用 writefile() 与 USB HID 设备成功通信
【发布时间】:2012-07-26 08:34:25
【问题描述】:

我对 C# 和 windows 编程相当陌生,我正在尝试在 windows xp pc 上的 USB HID 设备和用 c# 编写的应用程序之间建立通信。我已经成功获取了设备路径,并用它在设备上建立了一个有效的Handle:

IntPtr drive = CreateFile(devicePath, GENERIC_READ | GENERIC_WRITE,
               FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero,
               OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, IntPtr.Zero);

这被证明是一个有效的句柄,在测试时会产生一个正整数。创建句柄后,我调用“HidD_GetPreparsedData”和“HidP_GetCaps”,它们产生一个先前导入的结构(HIDP_CAPS),该结构存储与连接的设备相关的特定数据。接下来,我尝试调用 writefile():

bool success = WriteFile(drive, ref outputReportBuffer, 
               caps.OutputReportByteLength, ref numberOfBytesWritten, 
               IntPtr.Zero); 

驱动器:设备的句柄

outputReportBuffer:要写入的字节数组[65]

caps.OutputReportByteLength:要写入的字节数,caps是HIDP_CAPS的struct

numberOfBytesWritten:硬编码为 0

IntPtr.Zero:我读过的所有内容都像我所做的那样传递了最后一个参数。在“writefile”的形式参数中,最后一个参数被列为“IntPtr ipOverlapped”,但我无法弄清楚它是什么,除了它应该作为某种形式的 0 传递

WriteFile 是如何导入的:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool WriteFile(IntPtr hFile, 
ref byte[] lpBuffer, 
uint nNumberOfBytesToWrite,
ref uint lpNumberOfBytesWritten, 
IntPtr ipOverlapped);

当 writefile 被执行时,它什么也不做。我没有收到任何错误,但是在测试时,它显示通信从未建立并且不成功。如果有人可以分享任何知识或提供任何资源来帮助我,我将不胜感激。感谢您的阅读。

问候。

【问题讨论】:

  • WriteFile 返回什么?在WriteFile 调用之后,lpNumberOfBytesWritten 包含什么?还有,为什么lpBuffer是通过引用传递的?
  • 感谢您的快速回复。 WriteFile 返回一个布尔值,在这种情况下为 false。调用后写入的 numberOfBytes 仍为 0,并且导入声明来自 pinvoke.com。这是我第一次使用winAPI,我不太清楚为什么它是通过引用传递的
  • 你试过删除ref吗?
  • 这样做了。你怎么知道通过 ref 传递参数是问题所在?

标签: c# usb hid


【解决方案1】:

删除ref 声明中的ref

虽然http://www.pinvoke.net/ 是一个很好的 P/Invoke 声明资源,但它是一个 wiki 风格的网站,许多声明都是错误的(通常它们无法在 x64 机器上工作)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2014-04-18
    • 2021-01-24
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多