The example program below demonstrates (using C++) how to continuously read channels 0 - 3. It also demonstrates device discovery which doesn't require the user to run InstaCal. InstaCal must still be installed because doing so installs the device drivers. At the bottom of this article you will find a Zip file that contains the Visual Studio 2008 project.
// VC_2008_USB-1808_Continuous.cpp : Defines the entry point for the console application.
#include "stdafx.h"
/* Include files */
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "cbw.h"
#define RATE 100
#define LowChan 0
#define HighChan 4
#define ChanCount 5
#define PACKET 64
#define COUNT PACKET * ChanCount
#define MAXNUMDEVS 100
void main ()
{
/* Variable Declarations */
int i=0;
int j=0;
int index = 0;
long curCount,curIndex;
int ULStat = 0;
int Gain = BIP10VOLTS;
long Rate = RATE;
short Status;
long halfbuf = COUNT/2;
long NumRows = PACKET/2;
bool NextReadUpper = false;
int numberOfDevices = MAXNUMDEVS;
DaqDeviceDescriptor inventory[MAXNUMDEVS];
DaqDeviceDescriptor DeviceDescriptor;
int BoardNum = -1;
float Rev = (float)CURRENTREVNUM;
ULStat = cbDeclareRevision(&Rev);
cbErrHandling(PRINTALL, STOPALL);
printf ("Demonstration of cbAInScan() in BACKGROUND mode\n\n");
//Ignore InstaCal device discovery
cbIgnoreInstaCal();
//locate USB devices
ULStat = cbGetDaqDeviceInventory(USB_IFC, inventory, &numberOfDevices);
for( i = 0; i < numberOfDevices; i++)
{
DeviceDescriptor = inventory[i];
//Product ID for USB-1808 = 0x13D
//Product ID for USB-1808X = 0x13E
//Product IDs can be found in ULProps.txt located in
// C:\Program Files (x86)\Measurement Computing\DAQ
if(DeviceDescriptor.ProductID == 0x13E)
{
BoardNum = i;
ULStat = cbCreateDaqDevice(BoardNum, DeviceDescriptor);
break;
}
}
if(BoardNum < 0)
{
printf("USB device not found...press any key to exit\n");
getch();
return;
}
//set all eight channel to single ended common ground; other option is DIFFERENTIAL
cbAInputMode(BoardNum,SINGLE_ENDED);
//allocate buffer
HANDLE MemHandle = 0;
MemHandle = cbWinBufAlloc32(COUNT);
double ScaledData[COUNT];
unsigned long RawData[COUNT]; //read counts
unsigned Options= BACKGROUND + CONTINUOUS + SCALEDATA;
//unsigned Options= BACKGROUND + CONTINUOUS; //read counts
//Start acquisition
ULStat = cbAInScan ( BoardNum,
LowChan,
HighChan,
COUNT,
&Rate,
Gain,
MemHandle,
Options);
if(ULStat != 0)
printf("%d",ULStat);
while(!_kbhit())
{
//this loop reads the low half of the buffer then the upper half continuously.
//it uses a NextReadUpper flag so that each half of the buffer is read once
ULStat = cbGetStatus(BoardNum,&Status,&curCount,&curIndex,AIFUNCTION);
if(ULStat != 0){
printf("Error Code %d\n",ULStat);
break;
}
if((curIndex > halfbuf) && (NextReadUpper == false))
{
NextReadUpper = true;
index = 0;
cbScaledWinBufToArray(MemHandle, ScaledData, 0, halfbuf);
//cbWinBufToArray32(MemHandle, RawData, 0, halfbuf); //read counts
for (j = 0; j< NumRows; j++)
{
for(i=0;i<ChanCount;i++)
{
printf ("%2.2f\t",ScaledData[index++]);
//printf ("%lu\t",RawData[index++]); //read counts
}
printf ("\n");
}
}
else if((curIndex < halfbuf) && (NextReadUpper == true))
{
NextReadUpper = false;
index = 0;
cbScaledWinBufToArray(MemHandle, ScaledData, halfbuf, halfbuf);
//cbWinBufToArray32(MemHandle, RawData, halfbuf, halfbuf); //read counts
for (j = 0; j< NumRows; j++)
{
for(i=0;i<ChanCount;i++)
{
printf ("%2.2f\t",ScaledData[index++]);
//printf ("%lu\t",RawData[index++]); //read counts
}
printf ("\n");
}
}
Sleep(1);
}
cbStopBackground(BoardNum,AIFUNCTION);
cbWinBufFree(MemHandle);
cbReleaseDaqDevice(BoardNum);
printf("Completed...press any key to exit\n");
getch();
}