我在使用libusb连接设备时遇到问题。我认为问题可能是我使用结构的方式,或者是内存分配。我正试图在我的一个结构中打开一个带有libusb结构的设备:
struct battery_data {
libusb_device *device_handled;
libusb_device_handle *handle;
int voltage;
int current;
int capacity;
int mode;
int ident;
uint8_t port[8];
};
typedef struct battery_data battery_data;
libusb函数,我认为,它导致了错误:
int libusb_open ( libusb_device * dev, libusb_device_handle ** dev_handle );
我的功能:
libusb_context *ctx = NULL;
int handler_pos = 0;
int USB_connect(char verbosity, libusb_device **list_device, battery_data *battery_data_list[20])
{
int connect, i;
cnt = libusb_get_device_list(NULL, &list_device); // list of devices plugged
for (i = 0; i < cnt; i++){ //going through every devices
connect = USB_connect_device(list_device[i], battery_data_list[handler_pos]);
}
return 0;
}
int USB_connect_device(libusb_device *list_device, battery_data *battery_data)
{
int j, error;
int config;
struct libusb_device_descriptor desc;
libusb_get_device_descriptor(list_device, &desc);
if(desc.idVendor == 0x0483 && desc.idProduct == 0x5740) //check if the device interests us
{
battery_data_element = malloc(sizeof(battery_data));
battery_data_element->device_handled = malloc(sizeof(libusb_device*));
battery_data_element->handle = malloc(sizeof(libusb_device_handle*));
error = libusb_open(list_device, &battery_data->handle); //SEGFAULT Here
battery_data->device_handled = list_device;
if(error != 0){fprintf(logfile, "nerror opening device while trying to connect %s n", libusb_error_name(error));}
else{
error = libusb_get_configuration(battery_data->handle, &config);
if(error != 0){
printf("n 33[0;31m error getting config while trying to connect %s n 33[0m", libusb_error_name(error));
return 1;
}
if(config != 1)
{
libusb_set_configuration(battery_data->handle, 1);
if (error != 0) {
printf("n 33[0;31m error setting config while trying to connect n 33[0m");
return 1;
}
else {
printf("n device now configured");
}
}
if(libusb_kernel_driver_active(battery_data->handle,0) == 1){ //determine if a driver is active
printf("nKernel driver active");
if (libusb_detach_kernel_driver(battery_data->handle, 0) == 0){ //if it is, detach it to be able to claim it
printf("n kernel driver detached");
}
else {
}
}
error = libusb_claim_interface(battery_data->handle, 0); //claim an interface on a device handle to perform I/O
if (error != 0){return 1;}
handler_pos++ //increment number if device if everything is fine
}
}
return 0;
}
返回错误:
Thread 1 "main" received signal SIGSEGV, Segmentation fault.
0x00007ffff7bc1fcd in libusb_open () from /lib/x86_64-linux-gnu/libusb-1.0.so.0
(gdb) backtrace
#0 0x00007ffff7bc1fcd in libusb_open ()
from /lib/x86_64-linux-gnu/libusb-1.0.so.0
#1 0x0000555555555798 in USB_connect_device (list_device=0x5555557733f0,
battery_data=0x0) at main.c:230
#2 0x00005555555556a6 in USB_connect (verbosity=1 ' 01',
list_device=0x55555576d990, battery_data_list=0x7fffffffdd50) at main.c:209
#3 0x0000555555555151 in main () at main.c:50
到目前为止,我尝试了很多方法来解决这个问题,但都没有奏效。如果你有什么想法。。。
至少这个问题是:大小分配错误。
battery_data_element->device_handled = malloc(sizeof(libusb_device*));
// ^^^^^^^^^^^^^^ wrong
// Wrong size here too.
battery_data_element->handle = malloc(sizeof(libusb_device_handle*));
避免在尝试用正确的类型进行编码时出错。分配到引用数据的大小。p = malloc(sizeof *p);
更易于正确编码、审查和维护。
battery_data_element->device_handled =
malloc(sizeof *(battery_data_element->device_handled));