xiangzichen 发表于 2024-4-7 01:52:56

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

终于自己搞定了.非常完美,全部开源,大家可随意修改使用!!



/************************************************************************************************
基于STC8H8K64U芯片.用官方的usb库,进行一些修改,目前功能如下:

VID PID 定义:
private const int CJX_VID = 0x34BF;
private const int CJX_PID = 0xFF02;

************************************************************************************************/

1. 支持hid升级,main.c中可以自行修改升级口令,默认:"@ofetcnc",下载一次后,勾选STC-HID升级,并设置VID,PID即可(点一次就可以升级,不用点第二次)
2. 上位机用c# + HidLibrary 库,和单片机交互非常方便.
   1) USB拔插自动恢复通信
   2) 三个按钮,每个点击后,对应单片机内部三个变量执行加一操作.对应发送指令为: " ofet-cmd1" " ofet-cmd3" " ofet-cmd3"
   3) 实时通信线程(ThreadOFET_CheckStatus),周期发送 " ofet-check",单片机收到这个信号,发送数据到上位机

    (发送到HID设备的数据,第一个字节默认为 0x00,所以命令第一个字符都是空格,然后发送前修改为 0x00)

3. 压缩包说明:
   !vs2022_Demo      vs2022工程
   app                      用户代码
   usb                     官方库

第一次用C#,好多特性不会用,目前运行倒是没有啥问题,如果有问题,大家可以发出来共同探讨.

最后再总结一下:   STC单片机确实好用.

补充:
增加了一个变量,按钮按下发送命令的同时,把变量+1, 然后把变量值显示在按钮上,
每次点击按钮时,实时通信的线程并没有停止,
按钮点击后,我按住回车不松手,,本地变量值和单片机收到命令次数是一致的,相当于一帧数据都没丢.
这个对于实时通信来说,太方便了,啥也不用考虑了.
真不知道单片机内部怎么处理的.居然一帧数据都没有丢失.
C#也是,线程里和主程序都同时使用了HID资源,也没有丢帧..真是省事啊.







乘风飞扬 发表于 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







xiangzichen 发表于 2024-4-8 20:39:54

本帖最后由 xiangzichen 于 2024-4-8 20:46 编辑

lgwd 发表于 2024-4-8 20:31
祝贺你成功!公开的源码在哪里?请问C#的HidLibrary库是VS自带的还是其它第三方开发的? ...
附件里啊.全都在,keil工程,vs工程,HidLibrary是第三方的.通过NuGet添加,我的工程里面有,不知道能不能自动加载,我第一次用C#,好多搞不清.


ahong 发表于 2024-4-7 08:44:18

官方有个例程,具体在哪下载的忘了,找找

xiangzichen 发表于 2024-4-7 09:45:59

ahong 发表于 2024-4-7 08:44
官方有个例程,具体在哪下载的忘了,找找

我好像也看到过,一个pdf文件里,说VC6怎么操作,但那个时候还没调试,现在调试通了,想做上位机,怎么也找不到了.{:cry:}

consoleyou 发表于 2024-4-7 09:57:11

可以请论坛里的这位大神出个教程。gentleman

xiangzichen 发表于 2024-4-7 10:00:24

本帖最后由 xiangzichen 于 2024-4-7 10:06 编辑

现在python可以调试通,这个代码和isp软件能通信

import hid

# pip install hidapi

def main():
    # 获取所有连接的 HID 设备
    devices = hid.enumerate()

    # 查找目标 HID 设备
    target_vid = 0x34bf
    target_pid = 0xff01
    target_device = None

    for device_info in devices:
      if device_info["vendor_id"] == target_vid and device_info["product_id"] == target_pid:
            target_device = device_info
            break

    if target_device is None:
      print("Target HID device not found.")
      return

    # 打开 HID 设备
    device = hid.device()
    device.open_path(target_device["path"])

    # 读取数据
    while True:
      data = device.read(64)# 读取最多64字节的数据
      if data:
            print("Received data:", data)

    # 关闭 HID 设备
    device.close()

if __name__ == "__main__":
    main()

xiangzichen 发表于 2024-4-7 10:06:14

c的话,这样的,怎么也不打开hid设备,如果把 L"\\\\.\\VID_34BF&PID_FF01" 改成 "L"\\\\.\\COM1",和串口通信一点问题都没有.是不是这一串字符定义的不对啊,还需要增加什么吗?
我后面增加stc的名字什么的,各种测试都不行.
看看群里有没有大神做这方面开发的.只要能提供一个打开设备成功的一句话就可以了.先行谢过各位了.



WCHAR deviceName[] = L"\\\\.\\VID_34BF&PID_FF01";
// 打开设备
HANDLE hDevice = CreateFileW(deviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE) {
    printf("Failed to open device.\n");
    return 1;
}




xiangzichen 发表于 2024-4-7 10:07:44

consoleyou 发表于 2024-4-7 09:57
可以请论坛里的这位大神出个教程。gentleman

也不能@别人,等大神自己发现吧.期待大神回复~~

xiangzichen 发表于 2024-4-7 10:08:39

神农鼎 发表于 2024-4-7 08:51
官方不管 上位机这个事

嗯,这个没关系,看看论坛里有没有大神做这方面的.

xxkj2010 发表于 2024-4-7 10:36:17

这个很难,专业性很强。
页: [1] 2 3 4 5
查看完整版本: USB-HID & 拔插自动恢复通信 & 自动升级 & C#2022 & HidLibrary库-----完全开源