/******************** (C) COPYRIGHT 2024 UPBot*********************************** * File Name : usb_read_data.cpp * Current Version : V1.0 * Author : UPBot Group * Date of Issued : 2024.04.11 * Comments : UWB USB-HID驱动 ********************************************************************************/ #include #include #include #include /**--------------------------------------------------------------------- * Function : print_devs * Description : 列举usb设备信息,和ls usb功能差不多 * Date : 2024/04/11 zhanli *---------------------------------------------------------------------**/ static void print_devs(libusb_device **devs) { libusb_device *dev; int i = 0; while ((dev = devs[i++]) != NULL) { struct libusb_device_descriptor desc; int r = libusb_get_device_descriptor(dev, &desc); if (r < 0) { fprintf(stderr, "Failed to get device descriptor."); return; } printf("USB Dev VID = %04x,PID = %04x (Bus %d, Device %d)\n", desc.idVendor, desc.idProduct, libusb_get_bus_number(dev), libusb_get_device_address(dev)); } } int main() { int r; ssize_t cnt; libusb_device_handle *dev_handle; // a device handle libusb_device **devs; // devices // libusb_context **ctx=NULL; // 初始化libusb r = libusb_init(NULL); if (r < 0) { printf("failed to init libusb\n"); return 1; } // 获取设备列表 cnt = libusb_get_device_list(NULL, &devs); if (cnt < 0) { printf("failed to get device list\n"); return 1; } // 打印usb设备信息 // print_devs(devs); dev_handle = libusb_open_device_with_vid_pid(NULL, 0x0483, 0x5750); if (dev_handle == NULL) { printf("Cannot open device\n"); return 1; }else{ printf("Device Opened\n"); } // free the list, unref the devices in it libusb_free_device_list(devs, 1); if (libusb_kernel_driver_active(dev_handle, 0) == 1) { // find out if kernel driver is attached printf("Kernel Driver Active\n"); if (libusb_detach_kernel_driver(dev_handle, 0) == 0) // detach it printf("Kernel Driver Detached!\n"); } // claim interface 0 (the first) of device (mine had jsut 1) r = libusb_claim_interface(dev_handle, 0); if (r < 0){ printf("Cannot Claim Interface\n"); return 1; } printf("Claimed Interface\n"); sleep(1); unsigned char data[64]; int transferred; // 用于实际判断传输的数据长度 int actual; while (1) { r = libusb_interrupt_transfer(dev_handle, (0x01 | LIBUSB_ENDPOINT_IN), data, 64, &transferred, 1000); if (r == 0 && actual == 127){ // 解析GeekIMU的磁力计信息 int16_t mx = *(int16_t *)(data + 3); int16_t my = *(int16_t *)(data + 5); int16_t mz = *(int16_t *)(data + 7); printf("mag:%d,%d,%d\n", mx, my, mz); }else{ printf("Read Error\n"); } //printf("%i,%i\n", r, actual); // 睡眠延时100ms usleep(1000 * 10); // 清屏 // printf("%s","\033[1H\033[2J");//clear display } // 释放 the claimed interface r = libusb_release_interface(dev_handle, 0); if (r != 0) { printf("Cannot Release Interface\n"); return 1; } printf("Released Interface\n"); // 关闭设备 libusb_close(dev_handle); // 结束时调用 libusb_exit(NULL); return 0; }