WIN32-C语言二次开发样例

4-软件触发模式

Hightlight:
C, C++, JAVA, Python通用
USB通讯
文档完善
思路清晰

邮件咨询与报价

klaus@jnewtech.com

电话/微信 咨询报价:150 0072 7503(微信同号)

  • 产品介绍

本Demo基于 Visual Studio 2019 开发,如果您使用Visual studio 2015,需要自行修改适当的配置, 如果您使用VS2019以上版本,无需修改


点击此处下载Demo


需要技术支持,可加微信 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;

}


相关标签:
相关产品
在线客服
联系方式

热线电话

150 0072 7503(微信同号)

上班时间

Monday to Saturday

公司电话

二维码
线