我正在使用libusb-1.0将BLE加密狗与RCU配对。
为此,我成功向加密狗接口写入了一个配对请求。
要收听加密狗响应,我使用了libusb_fill_interrupt_transfer
函数,并传递了一个回调,该回调将在收到响应时执行。
此函数接受文档(void *user_data
)中提到的参数,该参数可以在回调中使用。但是当我尝试使用此参数时,出现编译错误。
未声明(此功能首次使用)
在调用上一个函数和声明回调之后:
libusb_fill_interrupt_transfer(pairing->transfer, dctx->devh, 0x84, pairing->buffer,
sizeof(pairing->buffer), cb_aknowledgement, pairing, 0);
static void cb_aknowledgement(struct libusb_transfer *transfer)
{
if (pairing->transfer->status != LIBUSB_TRANSFER_COMPLETED) {
printf( "img transfer status %d?\n", pairing->transfer->status);
libusb_free_transfer(pairing->transfer);
pairing->transfer = NULL;
return;
}
if(pairing->buffer[0]!=0x05 || pairing->buffer[1]!=0x21)
{
printf( "wrong command recieved\n");
libusb_free_transfer(pairing->transfer);
pairing->transfer = NULL;
return;
}
printf("I've read data \n");
printf("USB Report Id = 0x%x \n",pairing->buffer[0]);
printf("Command = 0x%x \n",pairing->buffer[1]);
printf("Acknowledgement type = 0x%x \n",pairing->buffer[2]);
return ;
}
问题是:如何使用作为参数传递给回调的user_data
?
答案 0 :(得分:0)
使用transfer->user_data
。来自libusb_transfer structure doc:
数据字段
无效* user_data
用户上下文数据传递给回调函数。
我不知道pairing
是什么类型,但是看起来像这样:
int main() {
...
struct pairing_type_s *pairing = pairing_init();
...
libusb_fill_interrupt_transfer(pairing->transfer, dctx->devh, 0x84, pairing->buffer,
sizeof(pairing->buffer), cb_aknowledgement, pairing, 0);
...
}
// Then later:
static void cb_aknowledgement(struct libusb_transfer *transfer)
{
assert(transfer != NULL);
struct pairing_type_s *pairing = transfer->user_data;
assert(pairing != NULL);
// use pairing like a pro
...
}
但是,如果您确保始终将{{1}的libusb_fill_interrupt_transfer
与{{1}一起调用pairing->transfer
并使用cb_aknowledgement
宏,那么您也可以变得更加专业:
container_of
但是在这种情况下,我更喜欢第一种方法,因为它更具可读性且更无误。