gpt4 book ai didi

c - 在 libusb_fill_interrupt_transfer 回调中使用 "user_data"时出错

转载 作者:行者123 更新时间:2023-11-30 16:28:24 24 4
gpt4 key购买 nike

我正在使用 libusb-1.0 将 BLE 加密狗与 RCU 配对。

为此,我成功地将配对请求写入加密狗接口(interface)。为了收听加密狗响应,我使用函数 libusb_fill_interrupt_transfer我传递了一个回调,该回调将在收到响应时执行。此函数接受一个参数,如文档 (void *user_data) 中所述,可在回调中使用。但是当我尝试使用此参数时,出现编译错误。

undeclared (first use in this function)

在调用前一个函数并声明我的回调之后:

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

最佳答案

使用transfer->user_data。来自 libusb_transfer structure doc :

Data Fields
void * user_data
User context data to pass to the callback function.

我不知道配对的类型是什么,但它看起来像这样:

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
...
}

但是,如果您确保始终使用 pairing->transfercb_aknowledgement 调用 libusb_fill_interrupt_transfer 并使用 container_of宏:

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, NULL, 0);
...
}

// Then later:

static void cb_aknowledgement(struct libusb_transfer *transfer)
{
assert(transfer != NULL);
struct pairing_type_s *pairing = container_of(transfer, struct pairing_type_s, transfer);
assert(pairing != NULL);
// use pairing like a pro
...
}

但在这种情况下我更喜欢第一种方法,因为它更具可读性并且更无错误。

关于c - 在 libusb_fill_interrupt_transfer 回调中使用 "user_data"时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52385240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com