0

我正在使用 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 的成员函数中调用。

4

3 回答 3

0

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

编辑:这应该是 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 中以消除歧义。

于 2013-10-21T18:21:28.297 回答
0

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

 static void LIBUSB_CALL readDataFromBuffer(struct libusb_transfer *);
于 2013-10-21T19:31:41.230 回答
0

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)

可以向您的类添加一个静态类函数,并在该静态函数中调用该类的非静态成员 函数。

这个对象将在void *user_data的地方。

静态类函数中,您必须将transfer->user_data的成员 正确地转换为您的类。

于 2018-12-12T18:47:03.127 回答