【问题标题】:How to pass callback function to libusb bulk transfer function in C++ Class如何将回调函数传递给 C++ 类中的 libusb 批量传输函数
【发布时间】:2013-10-21 17:54:26
【问题描述】:

我正在使用 libusb 与 USB 设备进行交互。我创建了一个类,一个成员函数将接收来自设备的输入并进行处理。我正在使用异步 api。现在 libusb_fill_bulk_transfer() 函数调用会引发编译错误:

void MyDeviceClass::on_connectButton_clicked()
{
   int r; //for return values
   ssize_t cnt; //holding number of devices in list
   r = libusb_init(&ctx); //initialize the library for the session we just declared
   if(r < 0) {
      qDebug()<<"Init Error "<<r<<endl; //there was an error
      return;
   }
   ...
   ...
   ...

   libusb_fill_bulk_transfer( transfer_in, dev_handle, USB_ENDPOINT_IN,
            inBuffer, LEN_IN_BUFFER,readDataFromBuffer,NULL,0);
   libusb_submit_transfer(transfer_in);
   QtConcurrent::run (this,&MyDeviceClass::eventThread);
}

编译器建议使用 &MyDeviceClass::readDataFromBuffer 作为函数指针,但这仍然会引发错误。我尝试使用静态成员,甚至静态非成员函数,但都是徒劳的。请帮助我将回调传递给此函数。我正在使用 Qt,可能不喜欢使用 boost 库。 请注意 libusb_fill_bulk_transfer(...) 在 MyDeviceClass 的成员函数中调用。

【问题讨论】:

    标签: c++ callback usb function-pointers libusb


    【解决方案1】:

    我将成员函数设为静态,原型需要修改:

     static void LIBUSB_CALL readDataFromBuffer(struct libusb_transfer *);
    

    【讨论】:

    • 嗯好的,所以它需要是__stdcall。
    【解决方案2】:

    使用非成员函数时的编译错误是什么?

    编辑:这应该是 LIBUSB_CALL:

        void LIBUSB_CALL BulkTransferCallback(struct libusb_transfer *transfer) {
            // This assumes that you set transfer::user_data to be a pointer to 
            // an instance of the MyDeviceClass class.
            MyDeviceClass* mdc = reinterpret_cast<MyDeviceClass*>(transfer->user_data);
            mdc->onBulkTransferCallback(transfer);
        }
    

    然后当你设置指针时,使用:

    transfer.callback = &BulkTransferCallback;
    

    正如您自己回答的那样,实际上应该是由 LIBUSB_CALL 定义的 __stdcall。他们的文档应将其包含在函数指针 typedef 中以消除歧义。

    【讨论】:

    • 我在非成员函数错误 C2664 中收到以下错误:'libusb_fill_interrupt_transfer':无法将参数 6 从 'void (__cdecl *)(libusb_transfer *)' 转换为 'libusb_transfer_cb_fn'
    【解决方案3】:

    lib_usb api 定义了函数 libusb_fill_bulk_transfer:

    static void     libusb_fill_bulk_transfer (struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *buffer, int length, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout)
    

    可以添加一个静态类函数到你的类并调用非静态成员函数 这个静态函数中的类。

    您的 this 对象将位于 void *user_data 的位置。

    静态类函数中,你必须cast transfer->user_data 正确地传输到您的班级。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-02
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 2013-02-07
      • 2013-06-06
      相关资源
      最近更新 更多