Matlab探寻(三):自动识别串口设备并获取其串口号(serial && friendly name) 您所在的位置:网站首页 串口扫描枪不输出到文本 Matlab探寻(三):自动识别串口设备并获取其串口号(serial && friendly name)

Matlab探寻(三):自动识别串口设备并获取其串口号(serial && friendly name)

2024-07-12 08:58| 来源: 网络整理| 查看: 265

   Matlab编写的串口调试助手网上有很多,有些比较好用的可以从这里下载[Matlab串口助手]。但是这些串口调试助手每次都需要手动设置串口号,然后才能打开设备,调试可以用,但是交互体验不好。所以我最后实现的是让Matlab自动识别串口设备及其对应的串口号。

常见识别设备串口号的方法

   开始之前我们先来看看其他人主要是怎么识别串口设备的。

  a.任务管理器

   大家最常用的方法,每次都手动打开任务管理器,看看这个设备连接到了哪个串口上!例如我的一个串口设备CH340连接到了COM4上。

  b.遍历可用串口

   Matlab可以使用指令返回所有可用串口

Ports = instrhwinfo('serial'); %%查找所有可用串口

   该语句可以返回所有可用串口,结果如下图。然后Matlab后台编写程序和这些可用串口一个个握手,直到找到目标串口设备。这样不光效率低下,而且有时候对于没有握手信号的串口设备也不太可行。

自动识别设备串口号

   可是我既不想每次都手动打开任务管理器,也不想暴力遍历所有串口,那么怎么办呢?所以我想既然任务管理器里面有设备的名字,这里写图片描述,而且Matlab那么强大,能不能去识别这个设备名字呢?答案是肯定的。    查了很多资料,最终写出了这个函数。该函数利用dos命令,在两个地方扫描Windows注册表,并将活动的COM端口与注册的“friendly name”和“service”关联起来。该函数返回一个N×2单元阵列,其中N是活动COM端口的数量。每行的第一列是串口设备的“friendly name”,第二列是它的COM号。如果没有找到具有“friendly name”的设备,则设备是空的。

function devices = IdentifySerialComs() 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(1,vals{:}); for i = 1:numel(vals) if strcmp(vals{i}(1:min(12,end)),'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(1,sers{:}); 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 = textscan(vals,'%s','delimiter','\t'); vals = cat(1,vals{:}); if (numel(vals)>1) vals=strread(vals{2},'%s','delimiter',' '); Count=hex2dec(vals{3}(3:end)); if Count>0 [~, vals] = dos(['REG QUERY ' key]); vals = textscan(vals,'%s','delimiter','\t'); vals = cat(1,vals{:}); out=0; j=0; for i = 1:numel(vals) Enums=strread(vals{i},'%s','delimiter',' '); try nums=hex2dec(Enums{1}); catch nums=-1; end if(nums==j) out=['HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\' Enums{3}]; [~, listC] = dos(['REG QUERY "' out '" /s /f "PortName" /t "REG_SZ"']); listC = textscan(listC,'%s','delimiter','\t'); listC = cat(1,listC{:}); if (numel(listC)>1) listC=strread(listC{2},'%s','delimiter',' '); for i = 1:numel(coms) if strcmp(listC{3},coms{i}) [~, NameF] = dos(['REG QUERY "' out '" /s /f "FriendlyName" /t "REG_SZ"']); NameF = textscan(NameF,'%s','delimiter','\t'); NameF = cat(1,NameF{:}); com = str2double(coms{i}(4:end)); if com > 9 length = 8; else length = 7; end devices{i_dev,1} = NameF{2}(27:end-length); %#ok devices{i_dev,2} = com; %#ok Loop size is always small i_dev=i_dev+1; end end end j=j+1; end end end end end end

   运行之后可以看到返回的结果,整个过程仅耗时0.1s,如下图。第一列是串口设备的“friendly name”即设备名(”USB-SERIAL CH340”),第二列是它的COM号(COM4)。源码可以从这里下载[Matlab自动识别串口设备及其串口号]。

   之后,把该函数加到自己的程序中,识别对应的设备名就可以获取其串口号了。Well done!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有