|
我使用NI-DAQ 基于文本的API函数进行一个动态信号分析仪板卡(DSA)带缓存的模拟输入工作。所有进入DAQ数据数组缓存的函数都有一个数据类型标识为I16的缓存数组。例如,NI-DAQ中SCAN_Start 函数的函数参考原型是:
status = SCAN_Start (deviceNumber, buffer, count, sampTimebase, sampInterval, scanTimebase, scanInterval)
"buffer"这一参数的数据类型是I16,一个短型整数。然而在传统的NI-DAQ(Legacy) C Function Reference Help中,写到“只对DSA设备而言,buffer 应该是一个i32的数组。这些DSA设备返回一个32位的数据,该32位的数据位是最重要的位数”。到底哪个才是正确的缓存数组类型,I16还是I32?
当对DSA设备应用NI DAQ驱动中的基于文本的API编写程序时,缓存大小必须是一个4个字节的边界。如果该缓存被分配成一个I32的数组,它必须将类型转换成一个I16的指针,这个指针用于将该数组的地址传递给SCAN_Start。如果这个缓存被分配成一个双倍I16数组大小的数组,使用者在将这个buffer传递给SCAN_Start之前,必须首先检查这个缓存是否与一个4字节边界对齐。
当你在声明一个缓存数组时,数组类型必须选为I32.在C语言中,一个静态声明应该如下所示:
static i32 buffer[10000];
如果你更喜欢使用动态声明来动态的分配内存,你可以使用下列代码来声明一个指针并分配这个缓存buffer的空间:
static i32 *buffer;
buffer= (i32 *) malloc (sizeof(i32)*bufferSize);
然后,当使用NI-DAQ驱动函数调用这个缓存数组时,你必须通过类型转换将这个I32数据转成I16的类型。有许多的API函数需要这么做,包括SCAN_Start,DAQ_Montior, 和 DAQ_DB_Transfer。在使用SCAN_Start 调用时,你需要使用以下代码来转换I32数据类型的buffer:
SCAN_Start (iDevice, (i16 *) buffer, bufferSize, 0, 0, 0, 0);
请注意,在这个调用中采样时基,采样间隔和扫描时基参数都要设为0。当使用DSA设备时,扫描速率应该通过DAQ_Set_Clock function来设定。
|