当前位置: 首页 > backend >正文

使用libUSB-win32的简单读写例程参考

USB上位机程序的编写,函数的调用过程.

  1. 调用 void usb_init(void); 进行初始化

  2. 调用usb_find_busses、usb_find_devices和usb_get_busses这三个函数,获得已找到的USB总线序列;然后通过链表遍历所有的USB设备,根据已知的要打开USB设备的ID(VID/PID),找到相应的USB设备.

  3. 调用usb_open函数打开该USB设备

  4. usb_set_configuration(m_dev_handle, 1)   //设置配置 
  5. intint usb_claim_interface(usb_dev_handle *dev, int interface);   注册与操作系统通信的接口,这个函数必须被调用,因为只有注册接口,才能做相应的操作。
  6. 与USB设备进行通信。使用写入函数   int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout); 
  7. int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);//批量读取     从USB设备读取(接收)数据或向其写入(发送)数据。
  8. int usb_release_interface(usb_dev_handle *dev, int interface);  //注销被usb_claim_interface函数调用后的接口,释放资源,和usb_claim_interface对应使用。
  9.  int usb_close(usb_dev_handle *dev);//与usb_open相对应,关闭设备,是必须调用的, 返回0成功,<0 失败。
#include <stdio.h> 
#include <string.h> 
#include <iostream>
#include "conio.h"
#include "lusb0_usb.h"
#pragma comment(lib, "libusb.lib")#define m_dev_VID	0x1483        /* Vendor ID of the m_dev         */ 
#define m_dev_PID	0x5751        /* Product ID of the m_dev        */ 
#define EP1_OUT_SIZE	63	      //可根据设备修改大小
#define EP1_IN_SIZE	63int main(int argc, char *argv[]) 
{  struct usb_device * m_dev = NULL; struct usb_dev_handle *m_dev_handle; char str[64];memset(str,0,sizeof(str));usb_init(); usb_find_busses(); usb_find_devices(); struct usb_bus *bus; for(bus = usb_get_busses(); bus; bus = bus->next) { struct usb_device *dev; for(dev = bus->devices; dev; dev = dev->next) { if(dev->descriptor.idVendor == m_dev_VID && dev->descriptor.idProduct == m_dev_PID) m_dev=dev; } } if(!m_dev) { printf("m_dev not found\n"); return 1; } m_dev_handle = usb_open(m_dev); if(!m_dev_handle) { printf("Could not open m_dev\n"); return 1; } printf("设备打开成功!\n"); if(usb_set_configuration(m_dev_handle, 1) < 0) { printf("Could not set configuration\n"); usb_close(m_dev_handle); return 1; } if(usb_claim_interface(m_dev_handle, 0) < 0) //claim_interface 0 注册与操作系统通信的接口 0{ printf("Could not claim interface\n"); usb_close(m_dev_handle); return 1; } //-----获取多个端点的地址-----------------------------int num_endpoint = m_dev->config->interface->altsetting->bNumEndpoints;for (int k = 0; k < num_endpoint; k++) {struct usb_endpoint_descriptor endpoint = m_dev->config->interface->altsetting->endpoint[k];int endpoint_address = endpoint.bEndpointAddress;printf("  Endpoint Address: 0x%02x\n", endpoint_address);}//------------------------------------------------------------char WriteTestData[2048] = {0};char ReadTestData[2048] = {0};for(int i = 0; i< 2048; i++){WriteTestData[i] = i;}//端点1写入数据int ret; ret = usb_bulk_write(m_dev_handle, EP_OUT, WriteTestData, EP1_OUT_SIZE, 500);if(ret != EP1_OUT_SIZE){printf("端点1写入数据失败! %d\n", ret);return 1;}else{printf("端点1写入数据成功!\n");}//端点1读取数据ret = usb_bulk_read(m_dev_handle, EP_IN, ReadTestData, EP1_IN_SIZE, 500);if(ret != EP1_IN_SIZE){printf("端点1读取数据失败! %d\n", ret);return 1;}else{printf("端点1读取数据成功!\n");for (int i = 0; i < EP1_IN_SIZE; i++){printf("%02X ", ReadTestData[i]);if(((i + 1) % 16) == 0){printf("\n");}}printf("\n");}/**************************************************************************/usb_release_interface(m_dev_handle, 0);		//注销接口,释放资源,和usb_claim_interface搭配使用。usb_close(m_dev_handle); printf("\n设备关闭\n"); return 0; 
} 

参考:使用libusb-win32库, 批量(bulk)传输方式, 编写上位机软件_编写上位机通讯软件实现usb device设备的 批量数据下载及上传功能-CSDN博客

Qt下libusb-win32的使用(二)批量读写操作 - lknlfy - 博客园

上位机程序:libusb,bulk端点传输,上位机程序资源-CSDN文库

http://www.xdnf.cn/news/6086.html

相关文章:

  • zookeeper本地部署
  • 存储扇区分配表:NAND Flash与SD NAND(贴片式SD卡)的架构差异
  • spark数据压缩
  • Linux动态库与静态库
  • 通用软件项目技术报告 - 导读IV(终)
  • leetcode二叉树相关题目复习(C语言版)
  • 【ROS】将Qt的Pro工程转换到ROS2的colcon
  • java基础:异常体系
  • 006-nlohmann/json 结构转换-C++开源库108杰
  • # 深度剖析LLM的“大脑”:单层Transformer的思考模式探索
  • 青少年编程与数学 02-019 Rust 编程基础 11课题、类型系统
  • GAN简读
  • npm install 报错
  • CS4334:一款高性能的立体声音频数模转换器
  • 如何自定义 Spring MVC 的配置?
  • 【unity游戏开发——编辑器扩展】使用EditorGUI的EditorGUILayout绘制工具类在自定义编辑器窗口绘制各种UI控件
  • 高速数字测试利器,新款是德科技UXR0504B示波器
  • RPA vs. 传统浏览器自动化:效率与灵活性的终极较量
  • STM32 片上资源之串口
  • 《实现模式》以Golang视角解读 价值观和原则 day 1
  • 快速定位到源码位置的插件 - vite/webpack
  • 【Python】普通方法、类方法和静态方法的区分
  • hbase shell的常用命令
  • 双目云台摄像机:双摄安防功能全方位
  • Java运行原理分析
  • LeetCode 热题 100 114. 二叉树展开为链表
  • Spring的bean的生命周期?
  • 【机器学习】支持向量回归(SVR)从入门到实战:原理、实现与优化指南
  • 各大编程语言基本语法区别
  • 游戏引擎学习第279天:将实体存储移入世界区块