找回密码
 立即注册
楼主: xiangzichen

USB-HID & 拔插自动恢复通信 & 自动升级 & C#2022 & HidLibrary库-----完全开源

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-4-7 11:30:20 | 显示全部楼层
用Delphi的同学可以用JvHidController控件可以开发,相对比较简单
usb hid.png
  1. procedure TForm1.HIDctrl1DeviceData(HidDev: TJvHidDevice; ReportID: Byte;
  2.   const Data: Pointer; Size: Word);
  3. var
  4.   rcv_data :array of Byte;
  5.   rcv_str:string;
  6. begin
  7.     SetLength(rcv_data,Size+2);
  8.     SetLength(rcv_str,Size+2);
  9.    if (HidDev.Attributes.VendorID = USB_VID) and (HidDev.Attributes.ProductID = USB_PID) then
  10.     begin
  11.         mmo1.Lines.Add(Format('收到数据.【%s ; %s】', [HidDev.ProductName, HidDev.SerialNumber]));
  12.         move(Data^,pchar(@rcv_data[1])^,Size);
  13.         move(Data^,pchar(@rcv_str[1])^,Size);
  14.         mmo1.Lines.Add(StrToHexStr(rcv_str));
  15.     end;
  16. end;
复制代码
  1. procedure TForm1.btn1Click(Sender: TObject);
  2. var
  3.   I: Integer;
  4.   Written: Cardinal;
  5.   ToWrite: Cardinal;
  6.   Str: string;
  7.   Err: DWORD;
  8.   Send:TReport;
  9. begin
  10.   if Assigned(a) then
  11.   begin
  12.     Send.ReportID := $00;
  13.     Send.Data[0]:= $00;
  14.     Send.Data[1]:= $CC;
  15.     ToWrite := a.Caps.OutputReportByteLength;
  16.     if not a.WriteFile(Send, ToWrite, ToWrite) then
  17.     begin
  18.       mmo1.Lines.Add('发送失败');
  19.     end
  20.   end;
  21. end;
复制代码
  1. procedure TForm1.HIDctrl1Arrival(HidDev: TJvHidDevice);
  2. begin
  3.     if HidDev.ProductName='STC USB Device' then
  4.     begin
  5.         mmo1.Lines.Add(Format('设备连接成功.【%s ; %s】', [HidDev.ProductName, HidDev.SerialNumber]));
  6.         mmo1.Lines.Add(Format('VID:%.4x/PID:%.4x', [HidDev.Attributes.VendorID,HidDev.Attributes.ProductID]));
  7.         USB_VID:=HidDev.Attributes.VendorID;
  8.         USB_PID:=HidDev.Attributes.ProductID;
  9.         a := HidDev;
  10.     end;
  11. end;
复制代码
  1. procedure TForm1.HIDctrl1Removal(HidDev: TJvHidDevice);
  2. begin
  3.     if (HidDev.Attributes.VendorID = USB_VID) and (HidDev.Attributes.ProductID = USB_PID) then
  4.     begin
  5.         if (Assigned(a)) and (not a.IsPluggedIn) then
  6.         begin
  7.             HIDctrl1.CheckIn(a);
  8.         end;
  9.         a := nil;
  10.         //DeviceEnabled;
  11.        mmo1.Lines.Add('设备已移除');
  12.     end;
  13. end;
复制代码




睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-04-25 16:31:21
已绑定手机

14

主题

600

回帖

2199

积分

荣誉版主

积分
2199
发表于 2024-4-7 11:49:04 | 显示全部楼层
晓*** 发表于 2024-4-7 11:30
用Delphi的同学可以用JvHidController控件可以开发,相对比较简单

Delphi可以凑合用一下,我试试看,我主要想把上位机这里封装成dll,这样方便提供给客户.即便不提供给客户,自己用也方便.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-4-7 11:50:33 | 显示全部楼层
xiangz*** 发表于 2024-4-7 11:49
Delphi可以凑合用一下,我试试看,我主要想把上位机这里封装成dll,这样方便提供给客户.即便不提供给客户,自 ...

当然是可以的,之前这方面资料太少了,花银子才买到这种古老的控件,不知道为什么没人搞开源控件。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-04-25 16:31:21
已绑定手机

14

主题

600

回帖

2199

积分

荣誉版主

积分
2199
发表于 2024-4-7 11:53:18 | 显示全部楼层
晓*** 发表于 2024-4-7 11:50
当然是可以的,之前这方面资料太少了,花银子才买到这种古老的控件,不知道为什么没人搞开源控件。 ...

这个是第三方的啊,,,,我没有安装delphi,有个lazarus看看有没有可用的.其实python很方便,自己玩可以,做个产品或者给别人,还是封装起来比较好.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:512
  • 最近打卡:2025-05-01 09:14:27

21

主题

564

回帖

2674

积分

金牌会员

积分
2674
发表于 2024-4-7 13:46:21 | 显示全部楼层
你自己研发一个上位机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-04-25 16:31:21
已绑定手机

14

主题

600

回帖

2199

积分

荣誉版主

积分
2199
发表于 2024-4-7 14:23:05 | 显示全部楼层
wangxi*** 发表于 2024-4-7 13:46
你自己研发一个上位机

这不就是自己在搞吗,搞不定,所以才来坛子求助了.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:244
  • 最近打卡:2025-05-01 15:50:20

49

主题

129

回帖

1361

积分

金牌会员

积分
1361
发表于 2024-4-7 20:45:43 | 显示全部楼层
上位机使用HID不是一个很简单的事!使用哪种编程语言?熟悉这种语言吗?
一般还是使用STC的CDC串口,串口调试助手大把的。

STC的工具包含的串口助手等也很优秀。
回复 支持 反对

使用道具 举报 送花

7

主题

22

回帖

257

积分

中级会员

积分
257
发表于 2024-4-7 21:00:29 | 显示全部楼层
我有代码,但不想公开, 可以提供几个关键字和关键流程,你拿去搜索。   
首先通过 HidD_GetHidGuid  接口获取到hid设备的guid,  
然后通过 SetupDiGetClassDevs 获取到设备信息的结构,
接着调用 SetupDiEnumDeviceInterfaces 循环枚举hid设备,
并调用 SetupDiGetDeviceInterfaceDetail 接口获取设备信息,
得到的结构体就包括设备的路径 ,类似于 “\\\\?\\hid#vid_XXXX&pid_XXXX#” 。   

通过 CreateFile 打开这个路径,就可以通过读写文件来发送 HID 报文了。

说白了,主要就是需要拿到那个路径,就可以按照读写文件去操作 hid设备了。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-04-25 16:31:21
已绑定手机

14

主题

600

回帖

2199

积分

荣誉版主

积分
2199
发表于 2024-4-7 22:06:33 | 显示全部楼层
zdg*** 发表于 2024-4-7 21:00
我有代码,但不想公开, 可以提供几个关键字和关键流程,你拿去搜索。   首先通过 HidD_GetHidGuid  接口获 ...

谢了~我就是那个路径搞不定.按照你的方法测试看看.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2024-4-7 22:11:16 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:31 , Processed in 0.219261 second(s), 120 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表