저는 libusb를 처음 사용하므로 잘 이해하지 못합니다. USB 통신을하려고합니다.C++ 11 비동기 사용시 Libusb가 응답하지 않습니다.
아주 잘 작동하는 핫 플러그 기능을 사용하고 있습니다. 그래서 나는 장치가 도착한 이벤트를 감지했을 때 C++11 비동기 기능을 사용하는 다른 스레드에서 USB와의 모든 통신을 수행 할 것이므로 단순히 여러 장치로 동기 I/O를 수행 할 수있었습니다. 비동기 I/O는 다소 혼란 스럽습니다. 다행스럽게도 동기 I/O를 C++ 비동기 기능과 함께 사용할 수 있습니다.
하지만 코드가 C++ 11 비동기 기능에서 실행될 때 libusb 호출이 멈추는 문제가 있습니다. C++ 11 비동기 기능에서 실행되지 않을 때는 문제없이 작동합니다.
그래서 내 C++ 11 비동기 기능 코드가 문제라고 가정합니다.
Opening
Opened
Closing
주요 코드는 다음과 같습니다 :
int main(int argc, char* argv[]) {
int vendor_id = 0x1234;
int product_id = 0x4556;
libusb_hotplug_callback_handle *hp = nullptr;
libusb_context *context = nullptr;
int rc = libusb_init(&context);
if(rc < 0)
{
return rc;
}
libusb_set_debug(context, LIBUSB_LOG_LEVEL_WARNING);
rc = libusb_hotplug_register_callback(
context,
LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED,
LIBUSB_HOTPLUG_NO_FLAGS,
vendor_id,
product_id,
LIBUSB_HOTPLUG_MATCH_ANY,
hotplug_callback,
NULL,
hp
);
if (LIBUSB_SUCCESS != rc) {
libusb_exit (context);
return rc;
}
while(1) {
rc = libusb_handle_events(context);
}
return 0;
}
그것이 출력
libusb_close
에 달려이 코드 그래서
int LIBUSB_CALL hotplug_callback(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *user_data)
{
std::future<void> result(std::async([] (libusb_device *d) {
libusb_device_handle *h;
printf("%s\n", "Opening");
int rc = libusb_open(d, &h);
if(rc != LIBUSB_SUCCESS) {
printf("ERROR: %s\n", libusb_error_name(rc));
return;
}
printf("%s\n", "Opened");
printf("%s\n", "Closing");
libusb_close(h);
printf("%s\n", "Closed!");
}, dev));
result.get();
return 0;
}
: 여기
내 핫 플러그 콜백입니다이 코드는 좀 더 프로토 타입이므로 실제로 작성한 것은 아닙니다. 아직 libusb의 탐색 모드에 있습니다.
감사합니다. 드디어 비동기 API를 사용했습니다. – pdiddy