【发布时间】:2015-06-10 10:51:03
【问题描述】:
我正在尝试通过 USB 在笔记本电脑和嵌入式板之间建立通信。主板的 USB 驱动程序已安装,并且已在 Windows 设备管理器中检测到。现在我正在使用 libusb 在 Visual Studio 2013(Win32 控制台应用程序)中开发代码。
libusb_init() 函数不会返回错误,但是当我尝试使用libusb_open_device_with_vid_pid() 打开设备时,libusb 库的threads_windows.c 文件中的函数usbi_mutex_init() 会中断执行。此文件包含“Microsoft Windows 上的 libusb 同步”的源代码。
我也尝试调用函数libusb_get_device_list(),但得到同样的错误。你能建议一个解决方案吗?
我的应用程序源代码中的main.cpp -->
#include <iostream>
#include "libusb.h"
using namespace std;
int main()
{
int init_status = 0;
libusb_context *context = NULL;
libusb_device_handle *device;
init_status = libusb_init(&context);
if (init_status<0)
{
cout << "could not initialize";
return -1;
}
device = libusb_open_device_with_vid_pid(NULL, 0x0483, 0x5750); //execution breaks here
if (device == NULL)
{
cout << "could not open device";
return -1;
}
else
{
cout << "Device opened successfukky";
}
return 0;
}
来自 libusb 源代码的threads_windows.c -->
int usbi_mutex_lock(usbi_mutex_t *mutex) {
DWORD result;
if(!mutex) return ((errno=EINVAL));
result = WaitForSingleObject(*mutex, INFINITE); //execution breaks here
if(result == WAIT_OBJECT_0 || result == WAIT_ABANDONED)
return 0; // acquired (ToDo: check that abandoned is ok)
return ((errno=EINVAL)); // don't know how this would happen
// so don't know proper errno
}
【问题讨论】:
-
在我看来,您使用
libusb_init()获得了特定的非默认上下文,但是当您使用libusb_open_device_with_vid_pid()时,您通过了NULL,这意味着使用默认上下文而不是您的上下文指针。 -
如果它是单个设备并且您只需要一个会话,您可能只想使用默认上下文。该文档表明
libusb_open_device_with_vid_pid()存在“限制”,并且它不适用于测试应用程序以外的任何内容。我认为这是因为在实际应用中可能有多个设备,而这个便利函数只接受第一个匹配参数的设备。但是,您看到的问题可能与上下文有关。 -
谢谢,这有助于解决问题。问题在于上下文。
标签: visual-c++ runtime-error libusb