如何仅使用ansi-c在Windows机器上连接GPIB设备

时间:2013-11-05 17:06:19

标签: c windows ansi gpib

如何仅使用ANSI-C和可能的Windows标头打开和关闭与GPIB设备的连接。

是否有默认方式执行此操作或gpib本身是否涉及第三方驱动程序?

1 个答案:

答案 0 :(得分:3)

仅使用Windows标头和ANSI C ......不太可能。正如Adriano指出的那样。

最简单的方法是使用VISA libraries。它们是不同制造商之间GPIB的标准化接口(差不多)......使用这个库,您的代码和生成的可执行文件将不关心您使用的VISA实现(示例警告链接到下面)......

您需要链接visa32.lib。这可以在目录$(VXIPNPPATH)/WinNT/lib/msc中找到。变量VXIPNPPATH,我认为默认设置为指向C:\Program Files (x86)\IVI Foundation\VISA\或32位计算机上的等效项。

然后可以在$(VXIPNPPATH)/WinNT/include

找到C VISA库的头文件

注意,根据您安装的跨厂商使用GPIB的VISA库,您可能需要进行一些配置。例如,当使用NI库成功连接到Agilent设备时,您必须启用option described in this article

我知道NI有一些你可以看的例子程序。打开和关闭设备的一般示例可能类似于......

ViStatus status;
ViChar buffer[80];
unsigned int board = 0, device = 10;

/* Open the default resource manage */
status = viOpenDefaultRM(&mVisaDefaultRM);
if (status < VI_SUCCESS)
    exit(-1);

/* Construct a string describing the GPIB device to open and open it! */
sprintf(buffer, "GPIB%u::%u::INSTR", board, device);    
status = viOpen(mVisaDefaultRM, buffer, VI_NULL, VI_NULL, &mVisaInst);
if (status < VI_SUCCESS)
{
    viClose(mVisaDefaultRM);
    exit(-1);
}

/* Close it */
viClose(mVisaInst);
viClose(mVisaDefaultRM);

然后,您可以使用API​​的其余部分进行各种操作...例如,要重置设备,您可能会编写类似的内容......

/* Reset the device */
status = viEnableEvent(mVisaInst, VI_EVENT_SERVICE_REQ, VI_QUEUE, VI_NULL);
if( status >= VI_SUCCESS )
{
    /* Send SDC (Selected Device Clear) to reset the information interchange 
     * between controller and instrument. 
     * Cleans input and output buffer, aborts operations that prevent 
     * processing of new commands etc. */   
    status = viClear(mVisaInst); 
    if (status >= VI_SUCCESS)
    {
        /* If the SDC successed progress onto reset the device and set it 
         * up for detecting SRQ events... */
        Write("*CLS;");     /* Clear status command. Clears the whole status structure */
        Write("*RST;");     /* Reset command. Abort all activities and initialise the device (instrument specific) */
        Write("*SRE 255;"); /* Service request enable. Disable all service requests except ESB: 0010_0000 */
        Write("*ESE 255;"); /* Standard event status enable. Disable all statuses except the errors and op complete: 0011_1101 */                   
    }
}

if (status < VI_SUCCESS)
{
    /* Do something */
}

National Instruments VISA API doc can be found here的一个例子。我相信安捷伦和其他人也必须拥有自己的版本。关键是你的代码和结果EXE不应该关心谁的实现正在被使用......

最后一点点链接......我发现this GPIB programming tutorial非常有用......