-1

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

是否有这样做的默认方式或 gpib 本身是否涉及第三方驱动程序?

4

1 回答 1

3

仅使用 Windows 标头和 ANSI C... 不太可能。正如阿德里亚诺指出的那样。

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

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

然后可以在以下位置找到 C VISA 库的头文件$(VXIPNPPATH)/WinNT/include

请注意,根据您安装的跨制造商使用 GPIB 的 VISA 库,您可能需要进行一些配置。例如,当使用 NI 的库成功连接到安捷伦设备时,您必须启用本文中描述的选项

我知道 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 文档的示例。我确信安捷伦和其他人也必须有他们的版本。他们的关键是您的代码和生成的 EXE 不应该关心正在使用谁的实现......

最后一个小链接...我发现这个 GPIB 编程教程非常有用...

于 2013-11-05T17:25:48.287 回答