使用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 63

    int 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文库

相关推荐
代码中介商5 小时前
Linux TCP 网络编程完全指南:从三次握手到高并发服务器
服务器·网络·tcp/ip
咖喱o5 小时前
QinQ/VLAN Stacking
linux·运维·服务器·网络
AI周红伟7 小时前
周红伟:运营商一季度净利集体下滑 Token运营提速
大数据·网络·人工智能
marsh02067 小时前
43 openclaw熔断与降级:保障系统在异常情况下的可用性
java·运维·网络·ai·编程·技术
汽车仪器仪表相关领域8 小时前
Kvaser Memorator Professional 5xHS CB:五通道CAN FD裸板记录仪,赋能多总线系统集成测试的旗舰级核心装备
大数据·网络·人工智能·单元测试·汽车·集成测试
初学者,亦行者8 小时前
计算机网络必考:一文吃透 TCP/IP 体系结构(附高清思维导图)
网络·tcp/ip
段一凡-华北理工大学8 小时前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章10:实时预警机制:跑在问题前面!
网络·人工智能·python·知识图谱·高炉炼铁·工业智能体
WJ.Polar9 小时前
Scapy基本应用
linux·运维·网络·python
@insist1239 小时前
信息安全工程师-入侵检测核心技术、APT 应对与工程实践
网络·安全·软考·信息安全工程师·软件水平考试
CDN36010 小时前
[硬核] 你的DNS正在“裸奔”?用Python手撕DNS劫持与隧道检测逻辑
开发语言·网络·python