找回密码
 立即注册
楼主: xiang***

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

[复制链接]
  • TA的每日心情
    奋斗
    昨天 08:58
  • 签到天数: 128 天

    [LV.7]常住居民III

    26

    主题

    1290

    回帖

    4007

    积分

    论坛元老

    积分
    4007
    发表于 2024-4-7 10:55:27 | 显示全部楼层
    xiangzichen 发表于 2024-4-7 10:08
    嗯,这个没关系,看看论坛里有没有大神做这方面的.

    这里有VC++版本的
    USB-HID 上位机操作源码,仅供参考:

    https://www.stcaimcu.com/forum.p ... ptid=4838&pid=70564


    截图202404092101448959.jpg




    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 84 天

    [LV.6]常住居民II

    13

    主题

    325

    回帖

    736

    积分

    荣誉版主

    热心市民

    积分
    736
    发表于 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;
    复制代码




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

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 66 天

    [LV.6]常住居民II

    11

    主题

    374

    回帖

    1093

    积分

    金牌会员

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 84 天

    [LV.6]常住居民II

    13

    主题

    325

    回帖

    736

    积分

    荣誉版主

    热心市民

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

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

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 66 天

    [LV.6]常住居民II

    11

    主题

    374

    回帖

    1093

    积分

    金牌会员

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

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

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 08:09
  • 签到天数: 157 天

    [LV.7]常住居民III

    12

    主题

    340

    回帖

    1066

    积分

    金牌会员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 66 天

    [LV.6]常住居民II

    11

    主题

    374

    回帖

    1093

    积分

    金牌会员

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

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-16 22:57
  • 签到天数: 2 天

    [LV.1]初来乍到

    33

    主题

    84

    回帖

    711

    积分

    高级会员

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

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

    使用道具 举报

    该用户从未签到

    6

    主题

    14

    回帖

    122

    积分

    注册会员

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

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

    说白了,主要就是需要拿到那个路径,就可以按照读写文件去操作 hid设备了。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 66 天

    [LV.6]常住居民II

    11

    主题

    374

    回帖

    1093

    积分

    金牌会员

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-1 07:45 , Processed in 0.073921 second(s), 66 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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