BCB版的串口枚举

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

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

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

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


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


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


下载地址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的同行们致敬!

猜你喜欢

转载自blog.csdn.net/gongzhu110/article/details/79219168
今日推荐