如何在Delphi中与HID USB设备通信

5

我已经研究这个问题有一段时间了,但就是做不对。我有一个用C++编写的软件版本,想要用Delphi重新制作,但我无法让它在Delphi中运行。我需要一些教程或指南,可以向我展示如何连接、读取和写入HID USB设备的数据。


关闭投票可能意味着您的问题缺乏足够的细节,无法直接回答。我们难道应该通过魔法知道您的C++程序是做什么的吗?为什么不明确说明呢? - Warren P
1
我希望我能投票反对关闭。请不要这样做。这是一个公平的一般性问题,关于如何与一个不常见的设备进行通信的方法。具体细节可以稍后再谈。我也想知道这个高层次的答案。 - mj2008
2个回答

7

1
每次我看到有人使用Robert的遗产时,都会让我微笑 :) ... +1 表示感谢你指出他的组件。 - 0xC0000022L
好的,我已经查看了帮助和演示,并成功获取了供应商名称和产品名称。那么如何编写Buffer[1] = 0x80呢? - Grant
在ReadWriteDemo中,您可以选择USB设备,在写入部分输入十六进制的字节字符串(例如$80)。通过菜单中的CurrentDevice.WriteFile(Buf,ToWrite,Written)发送缓冲区。如果有响应,它将出现在读取窗口中。希望这能帮到您。 - LU RD
当我使用ReadWriteDemo尝试向设备写入时,出现错误,地址为00000000的访问冲突,地址为0000000的写入。 - Grant
1
Robert Marquardt 的 SoftGem 链接已经失效。现在链接为:http://www.soft-gems.net/index.php/controls/human-interface-device-controller-suite - david
显示剩余2条评论

3
您可以使用QueryDosDevice获取完整设备名称。列出插入设备之前和之后的所有条目,并查看哪个新条目出现在列表中(我发现大多数HID设备在列表中出现两次,但还没有找到原因)。该代码将包含“USB”、“VID”、“PID”和GUID。
如果您在前缀中使用´\\?\´并将此句柄用作串行端口,则可以使用CreateFile来使用此代码(我个人更喜欢使用THandleStream)。代码可能如下所示:
var
  h:THandle;
begin
  h:=CreateFile(
    PChar('\\?\'+MyPortName),
    GENERIC_WRITE or GENERIC_READ,FILE_SHARE_WRITE or FILE_SHARE_READ,
    nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if h=INVALID_HANDLE_VALUE then RaiseLastOSError;
  MyPort:=THandleStream.Create(h);
  SetCommTimeouts(h,MyFCommTimeouts);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接