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
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 上海牛津英语_高中一年级上_词汇提炼.doc
- 数学源于生活用于生活.doc
- 苏教版四年级(下册)按课文填空.doc
- 苏版四年级(上册)数学第四单元教学案.doc
- 我国农业银行笔试题目和答案.doc
- 网络安全知识试题库完整.doc
- 我国农业机械化的现状和发展趋势.doc
- 五年级解方程及应用题知识点及例题.doc
- 系学生会学习部申请书(精选多篇).doc
- 小学生科技活动辅导教学案.doc
- 小学数学课堂教学中小组合作学习的有效性.doc
- weixin411医疗就诊微信小程序设计与实现开发-0d26l+django .zip
- 学校团委书记竞聘演讲稿[精选多篇].doc
- 学校消防工作计划(精选多篇).doc
- 一级锅炉水处理试题和答案.doc
- 义务教育阶段双语教育新教双语教学质量评估自查自评报告.doc