这是一个很晚的答案,但我也遇到了这个问题,我在网上搜索后找到了一个解决方案,找到了“总线报告的设备描述”。在我的情况下,我不需要“总线关系”,但我想它可能会以类似的方式检索。我正在使用 Windows 10 21H1 和 MATLAB R2021a。
简而言之,我的解决方案有 4 个步骤:
- 查找所有活动的 COM 端口设备。
- 查找所有设备的友好名称。
- 根据 1 和 2,获取所有活动 COM 端口设备的友好名称。
- 根据3,得到所有活动COM口设备的“总线上报设备描述”。
代码:
% To improve speed (x10) add jsystem to the path from here:
% https://github.com/avivrosenberg/matlab-jsystem/blob/master/src/jsystem.m
if exist('jsystem','file')
fsystem = @jsystem;
else
fsystem = @system;
end
% Find all the active COM ports
com = 'REG QUERY HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM';
[err,str] = fsystem(com);
if err
error('Error when executing the system command "%s"',com);
end
% Find the friendly names of all devices
ports = regexp(str,'\\Device\\(?<type>[^ ]*) *REG_SZ *(?<port>COM\d+)','names','dotexceptnewline');
cmd = 'REG QUERY HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ /s /f "FriendlyName" /t "REG_SZ"';
[~,str] = fsystem(cmd); % 'noshell'
% Get the friendly names of all active COM port devices
names = regexp(str,'FriendlyName *REG_SZ *(?<name>.*?) \((?<port>COM\d+)\)','names','dotexceptnewline');
[i,j] = ismember({ports.port},{names.port});
[ports(i).name] = names(j(i)).name;
% Get the "Bus reported device description" of all active COM port devices
for i = 1:length(ports)
cmd = sprintf('powershell -command "(Get-WMIObject Win32_PnPEntity | where {$_.name -match ''(%s)''}).GetDeviceProperties(''DEVPKEY_Device_BusReportedDeviceDesc'').DeviceProperties.Data"',ports(i).port);
[~,ports(i).USBDescriptorName] = fsystem(cmd);
end
此解决方案有效,但可能不干净。反正我不是 Windows 专家。建议高度赞赏。