USB-HID & 拔插自动恢复通信 & 自动升级 & C#2022 & HidLibrary库-----完全开源
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资源,也没有丢帧..真是省事啊.
xiangzichen 发表于 2024-4-7 10:08
嗯,这个没关系,看看论坛里有没有大神做这方面的.
这里有VC++版本的
USB-HID 上位机操作源码,仅供参考:
https://www.stcaimcu.com/forum.p ... ptid=4838&pid=70564
lgwd 发表于 2024-4-8 20:31
祝贺你成功!公开的源码在哪里?请问C#的HidLibrary库是VS自带的还是其它第三方开发的? ...附件里啊.全都在,keil工程,vs工程,HidLibrary是第三方的.
通过NuGet添加,我的工程里面有,不知道能不能自动加载,
我第一次用C#,好多搞不清.
官方有个例程,具体在哪下载的忘了,找找 ahong 发表于 2024-4-7 08:44
官方有个例程,具体在哪下载的忘了,找找
我好像也看到过,一个pdf文件里,说VC6怎么操作,但那个时候还没调试,现在调试通了,想做上位机,怎么也找不到了.{:cry:} 可以请论坛里的这位大神出个教程。gentleman 本帖最后由 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()
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;
}
consoleyou 发表于 2024-4-7 09:57
可以请论坛里的这位大神出个教程。gentleman
也不能@别人,等大神自己发现吧.期待大神回复~~ 神农鼎 发表于 2024-4-7 08:51
官方不管 上位机这个事
嗯,这个没关系,看看论坛里有没有大神做这方面的. 这个很难,专业性很强。