libusb之libusb_bulk_transfer之完整实例

最近研究libusb开源库,需要从下位机获取数据,下面是一个完整的例子:

 

#include "libusb.h"
int main(int argc, char* argv[])
{
libusb_context *usb_context = nullptr;
libusb_device **dev_list;
libusb_device *dev = NULL;
libusb_device *dev_temp;
libusb_device_handle *dev_handle = NULL;

int ret = -1;
ssize_t cnt;


if (ret = libusb_init(&usb_context) < 0)
{
printf("init error:%d\n",ret);
return ret;
}


if (cnt = libusb_get_device_list(usb_context, &dev_list) < 0)
{
printf("get device list error:%d\n", cnt);
return cnt;
}

int i = 0;
while ((dev_temp = dev_list[i++]) != NULL)
{
struct libusb_device_descriptor desc;
int r = libusb_get_device_descriptor(dev_temp, &desc);
if (r < 0) {
printf("get device descriptor error:%d");
return NULL;
}


/*printf("%x:%x (bus %d, device %d\n)",
desc.idVendor, desc.idProduct,
libusb_get_bus_number(dev_temp), libusb_get_device_address(dev_temp));*/
if ((desc.idProduct == 0xa4a0) && (desc.idVendor == 0x0525))
{
dev = dev_temp;
break;
}
}
if (dev == NULL)
{
printf("find dev error\n");
return -1;
}


ret = libusb_open(dev, &dev_handle);
if (dev_handle == NULL)
{
printf("open device error:%d\n", ret);
return ret;
}


ret = libusb_kernel_driver_active(dev_handle, 0);
if (ret == 1)
{
libusb_detach_kernel_driver(dev_handle, 0);
printf("driver error\n");
}


if (ret = libusb_claim_interface(dev_handle, 0) < 0)
{
printf("claim interface error:%d\n",ret);
libusb_free_device_list(dev_list, 1);
libusb_exit(usb_context);
return ret;
}


libusb_config_descriptor *config_descriptor_in = NULL, *config_descriptor_out = NULL;


//libusb_get_active_config_descriptor(dev, &config_descriptor);
int config = 0;
libusb_get_configuration(dev_handle, &config);


libusb_get_config_descriptor(dev, 0, &config_descriptor_in);
libusb_get_config_descriptor(dev, 1, &config_descriptor_out);
if (config_descriptor_in)
{
unsigned char data[4096] = "aaaaaffff";
unsigned char data_rec[4096] = "\0";
int length = 0;
//ret = libusb_bulk_transfer(dev_handle, config_descriptor_in->interface->altsetting->endpoint->bEndpointAddress, data, 9, &length, 0);
ret = libusb_bulk_transfer(dev_handle, 1, data, 4096, &length, 0);//host--------------->device
if (ret < 0)
printf("bulk transfer error\n");
else
{
for (int i = 0; i < 100000; i++)
{
memset(data_rec, 0, 4096);
ret = libusb_bulk_transfer(dev_handle, 129, data_rec, 4096, &length, 0);//device--------->host
printf("i = %d,receive data:%s",i, data_rec);
}
}

else 
printf("get config_descriptor error\n");
libusb_free_device_list(dev_list,1);
libusb_exit(usb_context);
return 0;
}

#include <libusb-1.0/libusb.h> #include <stdlib.h> #include <stdio.h> // 全局变量定义 static int s_rx_itf_idx = -1; // 接收接口索引 static int s_rx_ep_idx = 0; // 接收端点索引 static int s_rx_busy = 0; // 接收忙标志 static int s_rx_tn = 1; // 传输数量 static size_t s_rx_size = 4096; // 接收缓冲区大小 static libusb_device_handle* s_opened_handle = NULL; // USB设备句柄 // 回调函数原型 static void LIBUSB_CALL rx_cb(struct libusb_transfer* transfer); /* 获取端点信息的辅助函数 */ int usbdev_get_endpoint_info(int itf_idx, int ep_idx, int* address, int* type, int* mps) { // 实际实现需要查询设备描述符 *address = 0x81; // 假设IN端点 *type = 2; // 假设批量传输 *mps = 512; // 假设最大包大小 return 0; } /* 接收回调函数 */ static void LIBUSB_CALL rx_cb(struct libusb_transfer* transfer) { s_rx_busy = 0; // 重置忙标志 if (transfer->status == LIBUSB_TRANSFER_COMPLETED) { // 成功接收数据 printf("Received %d bytes\n", transfer->actual_length); // 这里添加数据处理逻辑... // 例如:process_data(transfer->buffer, transfer->actual_length); } else { fprintf(stderr, "Transfer error: %s\n", libusb_error_name(transfer->status)); } // 释放资源 free(transfer->buffer); libusb_free_transfer(transfer); } /* 完整的接收处理函数 */ void usb_receive_handler() { /* 接收处理 */ if ((s_rx_itf_idx != -1) && (s_rx_busy == 0)) { int address; int type; int mps; // Max Packet Size struct libusb_transfer* transfer; for (int n = 0; n < s_rx_tn; n++) { uint8_t* buffer = malloc(s_rx_size); if (buffer == NULL) { fprintf(stderr, "Failed to allocate buffer\n"); continue; } // 获取端点信息 if (usbdev_get_endpoint_info(s_rx_itf_idx, s_rx_ep_idx, &address, &type, &mps) != 0) { free(buffer); fprintf(stderr, "Failed to get endpoint info\n");
04-01
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值