联系人: 销售经理
手机: 150 0072 7503(微信同号)
邮箱: klaus@jnewtech.com
地址: 上海市杨浦区波阳路16号波阳创业园23幢A座207
4-软件触发模式
- Hightlight:
- C, C++, JAVA, Python通用
- USB通讯
- 文档完善
- 思路清晰
邮件咨询与报价
klaus@jnewtech.com
- 产品介绍
本Demo基于 Visual Studio 2019 开发,如果您使用Visual studio 2015,需要自行修改适当的配置, 如果您使用VS2019以上版本,无需修改
需要技术支持,可加微信 13801997980 (微信同号)王工
本样例主要说明光谱仪的触发模式(采集模式)软件触发
光谱仪的采集一般由PC发起,PC发起一次采集命令,光谱仪采集一张光谱,返回给PC,这样的模式叫软件触发
// specdemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "libspectrometer.h"
#include "stdio.h"
#include "conio.h"
//包含库文件
#ifdef _MSC_VER
#pragma comment(lib, "libspectrometer.lib")
#endif
//请根据实际设备上的光谱像素点个数,来配置这个值
#define PIXEL_COUNT 2048
//波长数组
double wavelength[PIXEL_COUNT] = { 0 };
//暗光谱数值数组
double darkSpectrum[PIXEL_COUNT] = { 0 };
//光谱数值数组
double spectrum[PIXEL_COUNT] = { 0 };
int main()
{
int err = 0;
//打开所有已经连接的USB光谱仪,一般这个打开函数我们需要检测返回值
//第一个参数0为将来扩展参数使用,没有含义,但请一定填写 0 ,不写0,会导致光谱仪打不开
//返回值为1表示正常,返回值为0,表示有错误,
//第2个表示错误代码,第2个参数err指明了返回的错误,
//如果有错误err 不为0 一般需要检查:
//1.驱动是否安装成功,在设备管理器中查看是否有spectrometer设备,驱动未安装则有感叹号
//2.USB线是否连接正确,
//3.设备指示绿灯是否在闪烁,【注意正常工作是绿灯闪烁】,若设备绿灯不亮,或者常亮,表明设备不正常,需要插拔USB重启
//返回值为1表示底层已处理此命令,并且参数正确,返回值为0,表示有错误,如参数错误,或者当前设备正忙在采集中,无法执行用户命令
//////////////////////////////////////////////////////////
//必须要注意,通常在visual studio调试中,开发者会点击暂停调试按钮,如果当前光谱数据正通过USB传输,暂停调试会导致
//光谱设备死机,这个是正常现象,不使用visual studio调试设备时,不会出现死机问题
//如何判断设备死机?光谱设备上绿色指示灯闪烁,则表示设备运行正常
//////////////////////////////////////////////////////////
if(libspectrometer_open_all_spectrometers(0, &err) == 0)
return 0;
//设置曝光时间
//第1个参数0表示默认的第一台光谱设备,1表示第二台设备
//第2个表示错误代码
//第3个参数,设置曝光时间10ms,注意单位是us微秒,一般我们设置的是毫秒,需要乘以1000,数字后加L是为了告诉编译器这个值是一个long类型
//如果同时连接多台光谱仪,则这里需要写光谱仪的index号,index号从0到size-1
//如,我们有2台设备同时连接,0表示第一台设备,1表示第二台设备
//注意,如果有多台设备,每次光谱仪插在不同的电脑的USB口上,枚举出来的顺序可能不一样,需要用户自行根据serial number来判断实际连接的设备
//返回值为1表示底层已处理此命令,并且参数正确,返回值为0,表示有错误,如参数错误,或者当前设备正忙在采集中,无法执行用户命令
libspectrometer_set_integration_time_microsec(0, &err, 10*1000L);
//读取光谱仪的波长范围
//第1个参数0,表示默认的第一台光谱设备,1表示第二台设备
//第2个表示错误代码
//第3个参数是一个double数组,用户需要在自己的应用中分配内存,和释放内存
//第4个参数,告诉底层libspectrometer,wavelength数组有多大,避免底层复制的时候数组越界
//返回值为1表示底层已处理此命令,并且参数正确,返回值为0,表示有错误,如参数错误,或者当前设备正忙在采集中,无法执行用户命令
libspectrometer_get_wavelengths(0, &err, wavelength, PIXEL_COUNT);
//设置触发模式,默认上电后的触发模式是 PC软件控制触发,也就是PC发送一次libspectrometer_get_raw_spectrum,返回一次数据
//第1个参数0,表示默认的第一台光谱设备,1表示第二台设备
//第2个表示错误代码
//第3个参数就是触发模式
// 1 软件控制触发,阻塞式返回,如曝光时间是1秒,则libspectrometer_get_raw_spectrum会在一秒后返回
// 2 外部信号控制触发,由外部信号电平控制,电平需保持2us宽度,电平是5v
// 3 Free Run连续采集模式,光谱仪会进入无线循环的采集状态,每次采到数据放入缓存,当光谱仪收到PC的读取光谱指令,
//光谱仪会把缓存中数据立刻发送给PC,但是缓存中数据,可能是没有更新的,和上次一样的数据
//返回值为1表示底层已处理此命令,并且参数正确,返回值为0,表示有错误,如参数错误,或者当前设备正忙在采集中,无法执行用户命令
libspectrometer_set_trigger_mode(0, &err, 1);
//采集暗光谱
libspectrometer_get_raw_spectrum(0, &err, darkSpectrum, PIXEL_COUNT);
printf("Dark Light is done ");
//设置平均次数,也就是每次光谱仪发起采集指令,光谱仪会自动采集10次,然后硬件自动做平均,仅仅返回平均后的结果
//第1个参数0,表示默认的第一台光谱设备,1表示第二台设备
//第2个表示错误代码
//第3个参数就是平均次数,每次光谱设备上电后,平均次数被设置为1
//返回值为1表示底层已处理此命令,并且参数正确,返回值为0,表示有错误,如参数错误,或者当前设备正忙在采集中,无法执行用户命令
libspectrometer_set_average(0, &err, 10);
//第1个参数0,表示默认的第一台光谱设备,1表示第二台设备
//第2个表示错误代码
//第3个参数是一个double数组,用户需要在自己的应用中分配内存,和释放内存
//第4个参数,告诉底层libspectrometer,spectrum数组有多大,避免底层复制的时候数组越界
//返回值为1表示底层已处理此命令,并且参数正确,返回值为0,表示有错误,如参数错误,或者当前设备正忙在采集中,无法执行用户命令
//目前是软件触发模式,一旦曝光中,无法取消,在普通软件触发模式下,无法中断曝光过程,
//因为底层函数是阻塞式访问,无法取消
libspectrometer_get_raw_spectrum(0, &err, spectrum, PIXEL_COUNT);
for (int i = 0; i < PIXEL_COUNT; i++)
{
//遍历整个光谱仪所有的像素,一一计算每个波长减去暗噪声的光谱
spectrum[i] = (spectrum[i] - darkSpectrum[i]);
}
//打印第100像素的光谱count值
printf("Pixel 100 is %f ", spectrum[100]);
//关闭所有USB光谱仪
//关闭前请确保,当前设备不在采集中,否则会导致USB设备通讯异常,可能需要重启USB
libspectrometer_close_all_spectrometers(&err);
//等待用户按键后退出程序
_getch();
return 0;
}
- 上一篇: 3-读取光谱数据集
- 下一篇: 5-自由运行触发模式


客服