欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BCB版的串口枚举

程序员文章站 2024-03-23 11:48:28
...

做自控近20年,脱离不了串口通信。原来需要获取电脑的串口时,采用的是读取注册表法,一直以来也使用正常。除非电脑系统问题造成多余的虚拟串口或usb串口号,清理**册表即可:

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control \COM Name Arbiter,
 删除数值项ComDB即可。

但是随着业务的扩展,面对的客户越来越高端,对我们的软件要求也从细节上做出了更高要求(所谓的智能化),所以一直以来也想找个更好用的枚举电脑串口的方法。

后来看到也是一个做工控的同行chinayu2007发布了个枚举串口的方法,试了试,发现该有的串口没有,不该有的确出现了。源码见:EnumPorts枚举当前计算机端口
运行结果:

BCB版的串口枚举

说明:我电脑的真实串口是com1,虚拟串口com8---14:

BCB版的串口枚举

这两天无意中在一个老外网站中浏览,看到了一个05年发布的枚举串口程序,也是bcb6.0版就下载下来试了试,很好,电脑该有的串口都有:

BCB版的串口枚举

下载地址BCB版串口枚举


光搬运人家的似乎不太高尚,自己原创个com编号排序的方法。因为枚举出来的串口号并不是按照com1/2/3----从小到大排列的,还得自己加工一遍。

自己的方法是容器,放出一直以来使用注册表枚举后并排序的源程序:

#include <Registry.hpp>
#include <vector>
using namespace std;


   vector <int> com;
    TStringList* List=new TStringList();
    TRegistry *reg = new TRegistry;
    reg->RootKey = HKEY_LOCAL_MACHINE;
    reg->OpenKey("HARDWARE\\DEVICEMAP\\SERIALCOMM",true);
    reg->GetValueNames(List);
    ComboBox1->Items->Clear();

    for(int i=0;i<List->Count;i++)
    {
        com.push_back((reg->ReadString(List->Strings[i])).Delete(1,3).ToInt());
    }
    sort(com.begin(), com.end());
    for(unsigned int i=0;i<com.size();i++)
    {
        ComboBox1->Items->Add("COM"+IntToStr(com[i]));
    }

    delete reg;
    delete List;
    ComboBox1->ItemIndex = 0;

不需注释,多余的话不说。


向仍然坚守bcb6.0的同行们致敬!

相关标签: bcb 串口 枚举

上一篇: CMake tutorial(1. start)

下一篇: