相关疑难解决方法(0)

使用C++在Windows中检测USB插入/删除事件

我正在为需要处理USB插入/删除事件的现有应用程序编写扩展.我知道感兴趣的设备的VID/PID.但是,我没有访问窗口句柄,所以我不知道是否RegisterDeviceNotification会有很多用处,除非有办法通过获取句柄WINAPI.使用C++检测USB插入/移除事件的最佳方法是什么?

Microsoft网站上的此示例代码显示了如何通过WMI接收事件通知:

如何修改以接收USB插入/移除事件?或者,我还有另一种方法吗?我正在使用Visual Studio 2008.谢谢.

附加信息

这是我到目前为止(减去错误处理):

DEFINE_GUID(GUID_INTERFACE_CP210x, 0x993f7832, 0x6e2d, 0x4a0f, 0xb2, 0x72, 0xe2, 0xc7, 0x8e, 0x74, 0xf9, 0x3e);

MyClass::MyClass()
{
    // Generate message-only window
    _pWndClassEx = (WNDCLASSEX *)malloc( sizeof(WNDCLASSEX) );
    memset( _pWndClassEx, 0, sizeof(WNDCLASSEX) );
    _pWndClassEx->cbSize = sizeof(WNDCLASSEX);
    _pWndClassEx->lpfnWndProc = (WNDPROC)WndProc; // function which will handle messages
    _pWndClassEx->hInstance = GetCurrentModule();
    _pWndClassEx->lpszClassName = pClassName;
    atom = RegisterClassEx( _pWndClassEx );
    _hWnd = CreateWindowEx( 0, pClassName, pWindowName, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL ); …
Run Code Online (Sandbox Code Playgroud)

c++ usb events asynchronous virtual-serial-port

21
推荐指数
3
解决办法
4万
查看次数

windows - 如何枚举所有连接的USB设备的设备路径?

我正在尝试使用SetupDi函数枚举所有连接的USB设备的设备路径.设备路径是CreateFile()中使用的路径,因此我可以与设备通信.

但是,SetupDiGetDeviceInterface需要一个接口GUID,但我不是专门寻找一个特定的接口(除了所有连接的USB).这部分被评为/*???*/在下面的来源中.

尝试的解决方案:

我试图提供GUID_DEVCLASS_UNKNOWN = {0x4d36e97e,0xe325,0x11ce,{0xbf,0xc1,0x08,0x00,0x2b,0xe1,0x03,0x18}}; 但这引起了"没有更多接口"的错误.

我也尝试将deviceInfoData.ClassGuid提供给SetupDiGetDeviceInterface但是我得到了与上面相同的错误,"没有更多的接口".

问题:

是否有涵盖所有USB设备的通用接口类?(HID,通用等)

或者是否有一个替代功能,它将为我提供设备的路径?(SetupDiGetDeviceInterfaceDetail返回的SP_DEVICE_INTERFACE_DETAIL_DATA结构的Instread).

资源:

HDEVINFO deviceInfoList
SP_DEVINFO_DATA deviceInfoData;
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData = NULL;
DWORD requiredLength = 0;
char *hardwareID = 0;

// Retrieve a list of all present devices
deviceInfoList = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES);

if (deviceInfoList == INVALID_HANDLE_VALUE) {
    SetupDiDestroyDeviceInfoList(deviceInfoList);
    return false;
}

// Iterate over the list
for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoList, i, &deviceInfoData); i++) {
    if (deviceInterfaceDetailData) LocalFree(deviceInterfaceDetailData); …
Run Code Online (Sandbox Code Playgroud)

windows usb winapi visual-c++

16
推荐指数
1
解决办法
3万
查看次数

具有多个网络摄像头的 OpenCV - 如何在代码中区分哪个摄像头?

以前,我曾使用具有以太网连接和不同 IP 地址的工业相机来进行多个相机设置。现在我正在尝试使用 OpenCV 进行多相机设置,但我不确定如何将 OpenCV VideoCaptureID 与特定相机相匹配。

我可能应该用我目前的情况作为例子来使我的问题更清楚。我目前连接了 3 个摄像头。如果重要的话,我正在使用 Ubuntu 18.04。这是我的输出lsusb(省略了除我连接的 3 个 Logitech 网络摄像头之外的所有内容):

$ lsusb
Bus 001 Device 013: ID 046d:0843 Logitech, Inc. Webcam C930e
Bus 001 Device 003: ID 046d:0843 Logitech, Inc. Webcam C930e
Bus 001 Device 006: ID 046d:0892 Logitech, Inc. OrbiCam
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我有 2C930e台和 1 台OrbiCam已连接。基于这篇非常有用的文章:

https://superuser.com/questions/902012/how-to-identify-usb-webcam-by-serial-number-from-the-linux-command-line

我发现我可以像这样获取摄像头的序列号:

$ sudo lsusb -v -d 046d:0843 | grep -i serial
  iSerial                 1 D2DF1D2E
  iSerial                 1 99A8F15E
$ sudo lsusb …
Run Code Online (Sandbox Code Playgroud)

webcam camera opencv

11
推荐指数
1
解决办法
2万
查看次数

Videocapture() 多摄像头

我的系统中有 3 个相同的相机在运行,它们之间的唯一区别是插入的 USB 端口。我需要使用 OpenCV 为每个摄像头加载一个特定的 Python 脚本,我的代码非常简单:

capture = cv2.VideoCapture(index)
Run Code Online (Sandbox Code Playgroud)

其中 index 在每个脚本中分别等于 0、1、2。当我重新启动 PC 并运行相同的代码时出现问题,有时会按预期运行,有时 1 或 2 个摄像头已切换其索引(未更改任何代码或从 USB 拔出),因此结果是在没有相应摄像头的情况下加载脚本。

例如,如果在 script2.py 中定义的相机索引为 2,那么我重新启动 PC,现在在运行 script2.py 时加载索引为 0 的相机。

对此有任何解决方案吗?如何指定 VideoCapture() 的物理端口始终相同?我运行的是Win10

提前致谢

python port camera opencv video-capture

7
推荐指数
0
解决办法
237
查看次数