ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 488|回复: 1

分享获取电脑中的串行口代码,顺便吐槽那些害死新手编程教学方法!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-4-24 01:25 | 显示全部楼层 |阅读模式
大家好,近来有需求编写一段代码去获取电脑中的串行口,
于是从网上搜索了几种方法:
试了几种不同方法,但都不太稳定可靠,然后找到读取系
统注册表来获取系统中的串口行方法,这种方法除了可靠、
快捷还实时,即便是USB转接出来的串行口,在拔插之后
注册表仍然会实时变动的,找到方法就进一步去实现了,
在微软官网找到如下一段代码,这段代码也被“高手们”
直接抄了发贴到CSDN,之所以加双引号的高手,就是抄的
人连变量名称都不带改动的!!代码范例如下:
  1. const HKEY_LOCAL_MACHINE = &H80000002
  2. strKeyPath = "SOFTWARE\NewKey"
  3. strComputer = "."
  4. iValues = Array("string1", "string2")
  5. Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\" & strComputer & "\root\default:StdRegProv")
  6. MultValueName = "Example Multistring Value"
  7. oReg.GetMultiStringValue HKEY_LOCAL_MACHINE,strKeyPath,MultValueName,iValues
  8. For Each strValue In iValues
  9. WScript.echo strValue
  10. Next
复制代码
我必须要吐槽以上这段代码了,首先代码属于微软官方很学术
写法,放在微软官网是没有问题,但CSDN的“高手”们照抄却
是害死了不少业余初学者:
①冗长的变量名对英语不好的中国初学者极不友好!
  例如:strKeyPath,你改成拼音lujing(路径)或者一个简单
  字母L,然后后面注释一下就都明白了!

②没必要变量太多了,理论上还占用系统资源!我作一个初学者
  多年来接触这些编程教程,发现有一个极不友好的教学方法,
  写代码的“高手们”似乎都很喜欢搞出许多变量出来,
   常常是:A的值是多少呢,看看B吧,那B的值是多少呢?
          噢!其实是从C那里获取的!那C的值又怎么来的呢?
          其实C的值就是5罗!我靠!你直接a = 5行不!!

   例如以上代码:变量strComputer其实就是一个英文小数点!
   为了TMD一个英文小数点居然要用11个英文字母去代表,
   而更过份的是,下面的代码中还要CPU再做一次字符串合并
   的操作!就直接  \\.\root\default……会死吗?

③多余的声明一大堆:const HKEY_LOCAL_MACHINE = &H80000002
  直接把&H80000002换到第7句的相应位置的参数中就好了,他偏不!
  某些极端的例子中,那些声明比核心起主要作用的代码还要多!
  初学者往往看着就头晕!教学者初心再好都打击人家的学习兴趣!


基于以上缺点!我认为教写代码的人,最好的方法应该是:
必须要尽快让代码足够简单,并能直接能跑起来,然后再慢慢详细讲
里面参数和结构,这样学习的人不至于看半天了,结果那冗长的代码还是
一运行就这里出错,那里不行,非常打击学习信心!!
以下是我相同功能的代码范例:
  1. Sub 获取本电脑的串行口()
  2. k = 1
  3. Set zcb = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") '创建访问系统信息的对象
  4. zcb.EnumValues &H80000002, "HARDWARE\DEVICEMAP\SERIALCOMM", C '读取&H80000002(HKEY_LOCAL_MACHINE)主目录下指定路径中子目录所有键的名称并存放到数组C中
  5. For Each i In C
  6. zcb.GetStringValue &H80000002, "HARDWARE\DEVICEMAP\SERIALCOMM", i, s '获取该COM口的号数(这个键的键值)存放到变量s中
  7. Cells(k, 1) = s
  8. k = k + 1
  9. Next
  10. End Sub
复制代码
注释:
第1行,过程开始
第2行,k是表格中行数变量
第3行,创建名为zcb(注册表拼音)对象,{impersonationLevel……是访问系统注册表的参数,
第4行,EnumValues获取指定注册表目录下所有键的名称,返回值存放到一个数组C中,
       &H80000002表示访问是注册表HKEY_LOCAL_MACHINE目录,以下是其它目录参数,直接
       换上就即可
       HKEY_CLASSES_ROOT   &H80000000        
       HKEY_CURRENT_USER   &H80000001        
       HKEY_USERS          &H80000003        
       HKEY_CURRENT_CONFIG &H80000005
       &H80000002"HARDWARE\DEVICEMAP\SERIALCOMM"一起就是描述注册表路径:
       HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
第5行,循环C数组中的键名称
第6行,GetStringValue获取指定注册表目录(和第4行一样),i名称的键的数值,
       返回值存放到一个字符串变量s中
第7行,把s的值赋值到EXCEL表格,第k行第1列中,其中k从1第1行开始。
第8行,k自增1
第9行,循环结束
第10行,过程结束

以上代码中的变量名字:k、zcb、i、C、s,可随便改为其他合法的变量名字。

我相信像我这样教学方法,对于英语水平不太高中国业余初学者会友好得多了


Book1.rar

8.71 KB, 下载次数: 6

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-8-9 11:24 | 显示全部楼层
非常赞同你说的,初学者就是要那种由简入难,教学者上来就将变量、字典、切片、数据结构,直接就把人给吓跑了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-25 20:46 , Processed in 0.039068 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表