首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在user_data回调中使用“libusb_fill_interrupt_transfer”时出错

在user_data回调中使用“libusb_fill_interrupt_transfer”时出错
EN

Stack Overflow用户
提问于 2018-09-18 11:08:55
回答 1查看 275关注 0票数 0

我正在使用libusb-1.0将BLE dongle与RCU配对。

为此,我成功地向dongle接口编写了配对请求。要侦听dongle响应,我使用函数libusb_fill_interrupt_transfer并传递一个回调,该回调将在接收响应时执行。该函数接受文档(void *user_data)中提到的一个参数,该参数可以在回调中使用。但是当我尝试使用这个参数时,我会得到一个编译错误。

未声明的(在此函数中首次使用)

在调用前一个函数和声明回调之后:

代码语言:javascript
复制
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参数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-18 11:14:17

使用transfer->user_data。来自转移结构文档

数据字段 空洞* user_data 传递给回调函数的用户上下文数据。

我不知道pairing的类型是什么,但是它应该是这样的:

代码语言:javascript
复制
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
     ...
}

但是,如果您确保始终使用带有libusb_fill_interrupt_transferpairing->transfer调用cb_aknowledgement并使用container_of宏,那么您也可以做得更专业:

代码语言:javascript
复制
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
     ...
}

但是我更喜欢这种情况下的第一种方法,因为它更易读,更无错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52385240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档