如何仅使用 ANSI-C 和可能的 Windows 标头打开和关闭与 GPIB 设备的连接。
是否有这样做的默认方式或 gpib 本身是否涉及第三方驱动程序?
仅使用 Windows 标头和 ANSI C... 不太可能。正如阿德里亚诺指出的那样。
最简单的方法是使用VISA 库。它们是不同制造商(几乎)之间到 GPIB 的标准化接口......使用这个库,您的代码和生成的可执行文件不会关心您使用谁的 VISA 实现(示例警告链接到下面)......
您将需要链接到visa32.lib
. 这可以在目录中找到$(VXIPNPPATH)/WinNT/lib/msc
。VXIPNPPATH
我认为该变量默认设置为指向您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 编程教程非常有用...