我正在尝试写入USB HID设备 .
我的代码曾经在32位XP上工作,但是对于不好我'm trying on 64bit Windows 7. I can find the device, get it'的路径,使用 CreateFile
win32 API函数打开一个句柄并将其传递给FileStream . 到目前为止一切似乎都很好 . 然后我将数据写入流并且USB设备什么都不做 .
我怎样才能找出为什么它没有做任何事情然后希望它能做些什么呢?
这是我的导入签名:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern SafeFileHandle CreateFile(
[MarshalAs(UnmanagedType.LPStr)] string name,
uint access,
int shareMode,
IntPtr security,
int creationFlags,
int attributes,
IntPtr template);
调用功能:
var handle = usb.Win32Wrapper.CreateFile(path, usb.Win32Wrapper.GENERIC_READ | usb.Win32Wrapper.GENERIC_WRITE, 0, IntPtr.Zero, usb.Win32Wrapper.OPEN_EXISTING, usb.Win32Wrapper.FILE_FLAG_OVERLAPPED, IntPtr.Zero);
将FileStream打开到设备:
_main = new FileStream(handle, FileAccess.Write, 1, true);
最后写到文件:
_main.Write(buffer,0,buffer.Length);
2 回答
如果不了解您设备的具体情况,很难说 .
您确认可以与设备通信(hidapi,HIDSharp等)吗?有's nothing saying a USB HID device can' t回复NAK直到时间结束,在这种情况下你的发送永远不会完成 .
我第一次尝试通过HID进行通信时遇到的问题(我已经使用Windows 7一段时间了,所以我不能说XP是否有相同的限制):
(1)确保包含报告ID字节 . 即使您的设备不支持,Windows也需要报告ID为0 .
(2)在Windows上,您的缓冲区需要与最大报告的长度相同 . 因此,例如,如果您的报告是48个字节,则需要写入49个字节(始终以报告ID开头) . 如果我不这样做,我似乎记得写错了 .
既然你提到了64位Windows ......
(3)我遇到的一个64位Windows特定问题是(从.NET 2.0和4.0开始)64位P / Invoke不会将OVERLAPPED结构(或NativeOverlapped)视为blittable . 因此,如果您使用'ref OVERLAPPED',它将进行复制,P / Invoke和复制 . 重叠操作假设内存不会出现细微的内存损坏等问题 . 您可以使用fixed()或stackalloc解决此问题 - 它与T *相同,即使结构已在堆栈上分配 .
希望这三个中的至少一个能解决你的问题 . :)
詹姆士
-------------------------------PRİNTBARCODE---------------
---------------------------------- EtiquetaTestCommand1 --------------- -----------
----------------------的PrinterName ---------------
----------------- SendStringToPrinter ----------------------