USB上位机程序的编写,函数的调用过程.
-
调用 void usb_init(void); 进行初始化
-
调用usb_find_busses、usb_find_devices和usb_get_busses这三个函数,获得已找到的USB总线序列;然后通过链表遍历所有的USB设备,根据已知的要打开USB设备的ID(VID/PID),找到相应的USB设备.
-
调用usb_open函数打开该USB设备
-
usb_set_configuration(m_dev_handle, 1) //设置配置
-
intint usb_claim_interface(usb_dev_handle *dev, int interface); 注册与操作系统通信的接口,这个函数必须被调用,因为只有注册接口,才能做相应的操作。
-
与USB设备进行通信。使用写入函数 int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);
-
int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);//批量读取 从USB设备读取(接收)数据或向其写入(发送)数据。
-
int usb_release_interface(usb_dev_handle *dev, int interface); //注销被usb_claim_interface函数调用后的接口,释放资源,和usb_claim_interface对应使用。
-
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博客