如何仅使用ANSI-C和可能的Windows标头打开和关闭与GPIB设备的连接。
是否有默认方式执行此操作或gpib本身是否涉及第三方驱动程序?
答案 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
注意,根据您安装的跨厂商使用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非常有用......