OnInitDialog()下添加如下代码: struct usb_bus *busses, *bus; // usb_dev_handle *handle = NULL; //这个需定义为全局变量,在读线程中也许使用 usb_init(); usb_find_busses(); usb_find_devices(); busses = usb_get_busses(); for(bus = busses; bus; bus = bus->next) { struct usb_device *dev; ### 基于libUsb库实现Hid USB设备通讯 #### 一、概述 本文旨在详细介绍如何在VC++6.0环境下利用libUsb库实现HID (Human Interface Device) USB设备的通信功能。HID设备是USB标准中定义的一类特定类型的设备,如键盘、鼠标等输入设备。libUsb是一个开源的跨平台库,用于控制USB设备,支持多种操作系统。本文将分步骤介绍整个开发流程,包括环境搭建、代码编写、设备交互等关键环节。 #### 二、准备工作 1. **下载libUsb-win32库及示例** 首先需要访问官方网站 [http://www.libusb.org/wiki/libusb-win32](http://www.libusb.org/wiki/libusb-win32) 下载适用于Windows的libUsb库(libUsb-win32),其中包含了一些示例代码。下载完成后解压文件。 2. **生成INF文件并安装驱动** 将HID USB设备连接至计算机,运行下载的库中的可执行文件,按照提示选择相应的PID和VID(产品ID和供应商ID),这通常指的是你连接的HID USB设备。通过此步骤会生成一个INF文件,用于安装设备驱动。 3. **添加必要的文件到工程中** 在VC++6.0中创建一个新的项目或打开现有的项目。确保将与生成的INF文件同目录下的`.lib`文件、`.dll`文件以及`usb.h`头文件添加到项目的文件夹中。此外,在项目设置(Project -》 Settings -》 Link)中,将`libusb.lib`库文件添加到“Object/Library Modules”中,并在源代码中包含`usb.h`头文件。 #### 三、编程实现 1. **定义全局变量** 在程序中定义一些必要的全局变量,这些变量将用于后续的设备通信。例如: ```c++ #define MY_VID 0x8888 #define MY_PID 0x0006 usb_dev_handle *handle; HANDLE m_hDevice = INVALID_HANDLE_VALUE; CWinThread *m_pReadReportThread = NULL; OVERLAPPED ReadOverlapped; char ReadReportBuffer[16] = {0}; BYTE KeyStatus = 0; volatile BOOL m_bReadReportRunFlag = FALSE; ``` 2. **初始化libUsb** 在`OnInitDialog()`函数中添加以下代码来初始化libUsb并查找目标设备: ```c++ struct usb_bus *busses, *bus; // usb_dev_handle *handle = NULL; // 定义为全局变量 usb_init(); usb_find_busses(); usb_find_devices(); busses = usb_get_busses(); for (bus = busses; bus; bus = bus->next) { struct usb_device *dev; for (dev = bus->devices; dev; dev = dev->next) { struct usb_device_descriptor *desc = &(dev->descriptor); if ((desc->idVendor == MY_VID) && (desc->idProduct == MY_PID)) { handle = usb_open(dev); if (!handle) { MessageBox("Error opening device:\n%s\n", usb_strerror()); return false; } } } } usb_set_configuration(handle, 1); usb_claim_interface(handle, 0); ``` 3. **写数据** 为了向USB设备发送数据,可以创建一个按钮并为其绑定一个事件处理函数。在该函数中添加如下代码来写入数据: ```c++ WriteReportBuffer[0] = 0x01; usb_bulk_write(handle, 0x01, WriteReportBuffer, 1, 10); ``` 4. **读数据** 读取USB设备数据需要创建一个线程来持续监听数据。在`OnInitDialog()`中添加创建线程的代码: ```c++ m_pReadReportThread = AfxBeginThread(ReadReportThread, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL); if (m_pReadReportThread == NULL) { CString strLog; strLog = "读报告线程创建不成功!"; ::AfxMessageBox(strLog); CloseHandle(m_hDevice); m_hDevice = INVALID_HANDLE_VALUE; exit(0); } m_pReadReportThread->m_bAutoDelete = FALSE; m_pReadReportThread->ResumeThread(); // 唤醒线程 ``` 5. **读线程函数** 读线程函数是一个全局函数,负责不断读取USB设备的数据: ```c++ UINT ReadReportThread(LPVOID lpParam) { CLibUsbHidTestDlg *pDlg = (CLibUsbHidTestDlg *)lpParam; ReadOverlapped.Offset = 0; ReadOverlapped.OffsetHigh = 0; ReadOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); m_bReadReportRunFlag = TRUE; while (TRUE) { if (!m_bReadReportRunFlag) { break; } DWORD dwBytesRead; if (usb_bulk_read(handle, 0x81, ReadReportBuffer, sizeof(ReadReportBuffer), &dwBytesRead, INFINITE) < 0) { MessageBox("Error reading from device!"); break; } // 处理读取到的数据 // ... } CloseHandle(ReadOverlapped.hEvent); return 0; } ``` #### 四、总结 通过上述步骤,我们可以成功地在VC++6.0环境中使用libUsb库实现HID USB设备的通讯功能。这一过程涵盖了环境搭建、代码编写、设备交互等多个方面,为开发者提供了一个完整的参考案例。需要注意的是,在实际开发过程中还需根据具体的设备特性调整代码细节,以确保良好的兼容性和稳定性。


















- wxw07104402013-10-22没有库,,没有库,
- 蟋蟀很帅2017-03-01没有库,基本没用....
- qq_273257072018-11-08资料非常一般
- 阿呆20202013-08-21可以用,但是不够好!
- cogan2013-10-19没有库,基本没用....

- 粉丝: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- A159基于springboot+vue的农产品销售系统(LW文档+完整前后端代码+sql脚本+开发文档+全套软件)
- A157基于springboot+vue的漫画天堂网(LW文档+完整前后端代码+sql脚本+开发文档+全套软件)
- A158基于springboot+vue的网上购物商城的设计与实现(LW文档+完整前后端代码+sql脚本+开发文档+全套软件)
- A160基于springboot+vue的攀枝花市鲜花销售系统(LW文档+完整前后端代码+sql脚本+开发文档+全套软件)
- A162基于springboot+vue+微信小程序的校园朋友圈(完整前后端代码+sql脚本+开发文档+全套软件)
- A161基于springboot+vue的零食销售商城的设计与实现(LW文档+完整前后端代码+sql脚本+开发文档+全套软件)
- A163基于springboot+vue的秦皇岛旅游景点管理系统(LW文档+完整前后端代码+sql脚本+开发文档+全套软件)
- 基于微信小程序的电子数据取证知识测试系统-6dz93fez【附万字论文+PPT+包部署+录制讲解视频】.zip
- 手写实现常用机器学习算法,助你深入理解原理
- SpringBoo基于微信小程序的电子数据取证知识测试系统【附万字论文+PPT+包部署+录制讲解视频】.zip
- 计算机四级网络工程师知识点全面总结-操作系统原理篇
- 计算机四级网络工程师知识点全面总结-计算机网络篇
- 目标检测-人脸检测数据集-20000张图-+对应VOC/COCO/YOLO三种格式标签+YOLO11一键训练脚本
- 南京大学机器学习课程在线判题系统
- OpenCV和YOLO的多路RTSP流实时处理实现


