• 大小: 2KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-15
  • 语言: Matlab
  • 标签: Matlab  串口  Serial  

资源简介

Matlab自动识别插入电脑的串口设备及其串口号。函数运行之后返回N×2的单元矩阵,N代表所有活动串口数目。每行的第一列是接入电脑的设备名称(例如'USB-SERIAL CH340'),第二列是其对应的串口号。

资源截图

代码片段和文件信息

function devices = IdentifySerialComs()
% function:identifies Serial COM devices on Windows systems by friendly name and service.
% output:a cell array where the first column holds the name of the device
%         and the second column holds the COM number. Devices returns empty if nothing is found.
% author:Modified by “yuhansgg(Shi Gaige)“ based on code of “Lorgio Teodovich“
% date: 2017.12.29

devices = [];

Skey = ‘HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM‘;
[~ list] = dos([‘REG QUERY ‘ Skey]);
if ischar(list) && strcmp(‘ERROR‘list(1:5))  %%strcmp 两个字符串相同返回1
    disp(‘Error: EnumSerialComs - No SERIALCOMM registry entry‘)
    return;
end
list = strread(list‘%s‘‘delimiter‘‘ ‘); %#ok requires strread()
coms = 0;
for i = 1:numel(list)  %%numel 返回元素个数
    if strcmp(list{i}(1:3)‘COM‘)
        if ~iscell(coms)
            coms = list(i);
        else
            coms{end+1} = list{i}; %#ok Loop size is always small
        end
    end
end
out = 0;
outK = 0;
for j=1:2
    switch j
        case 1
            key = ‘HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\‘;
        case 2
            key = ‘HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\FTDIBUS\‘;
    end
    [~ vals] = dos([‘REG QUERY ‘ key ‘ /s /f “FriendlyName“ /t “REG_SZ“‘]);
    if ischar(vals) && strcmp(‘ERROR‘vals(1:5))
        disp(‘Error: EnumSerialComs - No Enumerated USB registry entry‘)
        return;
    end
    vals = textscan(vals‘%s‘‘delimiter‘‘\t‘);
    vals = cat(1vals{:});
    for i = 1:numel(vals)
        if strcmp(vals{i}(1:min(12end))‘FriendlyName‘)
            if ~iscell(out)
                out = vals(i);
            else
                out{end+1} = vals{i}; %#ok Loop size is always small
            end
            if ~iscell(outK)
                outK = vals(i-1);
            else
                outK{end+1} = vals{i-1}; %#ok Loop size is always small
            end
        end
    end
end

i_dev=1;Sservices=[];
for i = 1:numel(coms)
    match = strfind(out[coms{i}‘)‘]);
    ind = 0;
    for j = 1:numel(match)
        if ~isempty(match{j})
            ind = j;
            [~ sers] = dos([‘REG QUERY “‘ outK{ind} ‘“ /f “Service“ /t “REG_SZ“‘]);
            sers = textscan(sers‘%s‘‘delimiter‘‘\t‘);
            sers = cat(1sers{:});
            if (numel(sers)>1)
                sers=strread(sers{2}‘%s‘‘delimiter‘‘ ‘);
                Sservices{i_dev} = sers{3};
                i_dev=i_dev+1;
            end
        end
    end
end
Sservices=unique(Sservices);

i_dev=1;
for ss=1:numel(Sservices)
    key = [‘HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\‘ Sservices{ss} ‘\Enum‘];
    [~ vals] = dos([‘REG QUERY ‘ key ‘ /f “Count“‘]);
    if ischar(vals) && strcmp(‘ERROR‘vals(1:5))
        %         disp(‘Error: EnumSerialComs - No Enumerated services USB registry entry‘)
        %         return
    end
    vals

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        5119  2017-12-29 10:37  IdentifySerialComs.m

评论

共有 条评论