C++ Builder调用辰昶仪器ChNetDriver库
@
Contents
需要的程序
- [x] 不低于编写C#库的netframework,本例中是netframework4.6.2
- [x] 光谱仪驱动,正常安装即可
- [x] 库文件,本例中的ChNetDriver.dll,CyUsb.dll
- [x] 注册com组件的工具,RegAsm.exe和gacutil.exe
配置步骤流程
安装netframework
安装netframework4.6.2文件夹下的ndp46-targetingpack-kb3045566.exe,也可以从微软官网自行下载,版本号要不低于4.6
安装光谱仪驱动
根据正常流程安装光谱仪驱动,右键我的电脑,从设备管理器中找到对应的光谱仪名称,右键点击更新驱动,然后指向光谱仪驱动文件夹的对应平台版本驱动即可
库文件复制
将库文件的文件夹中ChNetDriver.dll和CyUSB.dll复制到VB的工程文件夹下即可
注册COM组件
- 将注册com组件工具文件夹下的gacutil.exe和RegAsm.exe复制到工程文件夹下
- 以管理员身份运行打开命令提示符
- 在命令提示符窗口中转到工程文件夹下(注册COM组件工具已经复制到该目录下)
- 输入命令regasm ChNetDriver.dll /tlb: ChNetDriver.tlb /codebase
- 命令提示符窗口提示注册成功则说明注册成功,并且会生成一个ChNetDriver.tlb的文件
- 在命令提示符窗口输入命令gacutil /i ChNetDriver.dll
编写C++程序
本例是使用RAD Studio XE4基于C++builder进行开发的VCL Forms Application项目。
调用步骤(常用函数)
主要是介绍常用的函数,其他函数功能可自行查询手册了解
- 实例化一个Wrapper类的变量wrapper,所有函数都通过wrapper调用
//添加头文件,否则会报错
#include<ComObj.hpp>
// wrapper为光谱仪的包装类 ,所有函数都通过wrapper获取
Variant wrapper;
// 初始化
CoInitialize(NULL);
// 获取com组件中的wrapper类实例
wrapper = CreateOleObject("ChNetDriver.Wrapper");
- 第二步打开光谱仪设备接口
// 打开光谱仪,在获取wrapper实例之后首先要做这一步
Variant openSpectrometers = wrapper.OleFunction("OpenAllSpectrometers");
- 以上两步的顺序不可变动,以下顺序可以随意调换。获取光谱仪的像素点数,参数为光谱仪索引,从0开始
// 像素点数也代表了波长数组和光谱数组的长度
Variant numberOfPixels = wrapper.OleFunction<int>("GetNumberOfPixels", 0);
- 获取光谱仪的序列号,索引为光谱仪的台数索引
// 获取光谱仪序列号
Variant serialNumber = wrapper.OleFunction<int>("GetSerialNumber",0);
- 获取光谱仪的波长数组,长度为步骤3中获取的数据
// 获取光谱仪的波长数组,并添加到listbox中显示
Variant Wave = wrapper.OleFunction<int>("GetWavelengths", 0);
if (Wave.IsArray())
{
for (int i = 0; i < 2048; i++)
{
ListBox1->Items->Add(Wave.GetElement(i));
}
}
- 获取光谱仪采集的光谱数据,长度为步骤3中获取的数据
// 获取光谱仪的光谱强度
Variant spectrum= wrapper.OleFunction<int>("GetSpectrum", 0);
- 设置光谱仪的积分时间,积分时间即为光谱仪的曝光时间,积分时间越长,采集的光谱强度值越大,需要返回的数据的时间越长,积分时间以微秒为单位,为整数类型(不同型号的光谱仪的最短积分时间不同)
// 设置光谱仪的积分时间,底层库的积分时间单位是微秒
//一般型号的光谱仪的积分时间都是从毫秒开始的,所以要乘以1000
long integrationTime= Edit4->Text.ToInt()*1000;
wrapper.OleFunction<int, long>("SetIntegrationTime", 0, integrationTime);
- 设置光谱仪的平均次数,光谱仪会采集3次光谱,然后将3次的光谱数据求平均之后返回
//平均次数乘以积分时间是采集一次光谱的时间
//例如平均次数是3次,积分时间是1秒,则采集一次光谱的时间为3秒
long ave= Edit5->Text.ToInt();
wrapper.OleFunction<int, long>("SetScansToAverage", 0, ave);
- 设置平滑平均
//设置光谱仪的平滑点数
long bxr= Edit6->Text.ToInt();
wrapper.OleFunction<int, long>("SetBoxcarWidth", 0, bxr);
- 释放资源
//释放 COM 接口的引用
CoUninitialize();
联系方式
使用过程中有任何问题可以发邮件联系zmlin@choptics.com