Linux USB通信涉及使用操作系统提供的接口与USB设备进行数据交换。以下是一个简单的例子,展示了如何在Linux中使用C语言通过libusb库与USB设备通信。
USB(Universal Serial Bus):一种串行总线标准,用于连接计算机系统和外部设备。它支持热插拔,并且可以连接多个设备。
libusb:一个跨平台的USB库,允许应用程序直接访问USB设备,而不需要编写特定于操作系统的驱动程序。
以下是一个简单的示例,展示了如何使用libusb在Linux中列出所有连接的USB设备并打开一个特定的设备进行通信。
首先,确保你已经安装了libusb库和开发包:
sudo apt-get update
sudo apt-get install libusb-1.0-0-dev
#include <stdio.h>
#include <stdlib.h>
#include <libusb-1.0/libusb.h>
int main() {
libusb_device **devs;
libusb_device_handle *dev_handle;
ssize_t cnt;
int r;
// 初始化libusb
r = libusb_init(NULL);
if (r < 0) {
fprintf(stderr, "Init Error %d\n", r);
return 1;
}
// 获取设备列表
cnt = libusb_get_device_list(NULL, &devs);
if (cnt < 0) {
fprintf(stderr, "Get Device Error\n");
libusb_exit(NULL);
return 1;
}
// 遍历设备列表
for (ssize_t i = 0; i < cnt; i++) {
struct libusb_device_descriptor desc;
r = libusb_get_device_descriptor(devs[i], &desc);
if (r < 0) {
fprintf(stderr, "Failed to get device descriptor\n");
continue;
}
printf("Device Descriptor:\n");
printf(" bLength %5d\n", desc.bLength);
printf(" bDescriptorType %5d\n", desc.bDescriptorType);
printf(" bcdUSB %2x.%02x\n", desc.bcdUSB >> 8, desc.bcdUSB & 0xff);
printf(" bDeviceClass %5d\n", desc.bDeviceClass);
printf(" bDeviceSubClass %5d\n", desc.bDeviceSubClass);
printf(" bDeviceProtocol %5d\n", desc.bDeviceProtocol);
printf(" bMaxPacketSize0 %5d\n", desc.bMaxPacketSize0);
printf(" idVendor 0x%04x\n", desc.idVendor);
printf(" idProduct 0x%04x\n", desc.idProduct);
printf(" bcdDevice %2x.%02x\n", desc.bcdDevice >> 8, desc.bcdDevice & 0xff);
printf(" iManufacturer %5d\n", desc.iManufacturer);
printf(" iProduct %5d\n", desc.iProduct);
printf(" iSerialNumber %5d\n", desc.iSerialNumber);
printf(" bNumConfigurations %5d\n", desc.bNumConfigurations);
// 打开特定设备(例如,Vendor ID为0x1d6b,Product ID为0x0002)
if (desc.idVendor == 0x1d6b && desc.idProduct == 0x0002) {
dev_handle = libusb_open_device_with_vid_pid(NULL, desc.idVendor, desc.idProduct);
if (dev_handle == NULL) {
fprintf(stderr, "Could not open USB device\n");
continue;
}
// 进行设备通信(例如,获取设备状态)
unsigned char data[64];
int transferred;
r = libusb_bulk_transfer(dev_handle, LIBUSB_ENDPOINT_IN | 0x81, data, sizeof(data), &transferred, 0);
if (r == 0 && transferred > 0) {
printf("Received %d bytes: ", transferred);
for (int j = 0; j < transferred; j++) {
printf("%02x ", data[j]);
}
printf("\n");
} else {
fprintf(stderr, "Bulk transfer failed: %d\n", r);
}
libusb_close(dev_handle);
break;
}
}
// 释放设备列表
libusb_free_device_list(devs, 1);
// 退出libusb
libusb_exit(NULL);
return 0;
}
使用以下命令编译并运行示例代码:
gcc -o usb_example usb_example.c -lusb-1.0
./usb_example
libusb_open_device_with_vid_pid
返回NULL的情况。可以通过将用户添加到plugdev
组或使用sudo
运行程序来解决。libusb_open_device_with_vid_pid
返回NULL的情况。可以通过将用户添加到plugdev
组或使用sudo
运行程序来解决。通过以上步骤,你应该能够在Linux中使用libusb与USB设备进行基本的通信。
领取专属 10元无门槛券
手把手带您无忧上云