GPIB接口卡使用说明
简介
我所早在80年代初就自行研制各种GPIB接口产品,经过20年不断发
展,该产品开发已形成系列,是目前国内唯一能够与国外产品相媲美的GPIB接口。可广泛应用于各种仪器自动测量与控制系统。
ISA GPIB接口卡
该接口卡主要用于各种GPIB仪器的计算机控制以及仪器自动化测试系统的组建。该接口卡完全符合 IEEE-488国际
,并提供与VISA(虚拟仪器软件
结构)国际
兼容的标准化GPIB控制函数包。
性能及特点:
● 具有DOS和Windows两种不同操作系统下使用的产品。
●
ISA总线 GPIB接口卡
提供Windows操作系统软件开发工具包,可支持32位各种编程语言,如:VC++、 VB、Delphi、LabView、VEE和LabWindows/CVI。
● 提供VISA驱动函数和GPIB驱动函数,在LabVIEW编程语言中可替换原仪器驱动软件中VISA函数,而不影响原程序的使用。
● 提供快速的硬件诊断工具,以及快速仪器控制的交互式GPIB测试工具。
● 提供VisaulBASIC编程应用举例。
新产品PCI GPIB接口卡
随着微型计算机CPU速度、计算能力的迅速提高,与之相适应的计算机总线
技术也在不断发展,总线形式也在不断变换,当今PCI总线已成为微机产品中的主流总线,为适应总线技术的发展,我们新近开发出了基于PCI总线的GPIB接口卡,以满足新一代计算机产品在用于仪器测量控制方面的使用要求。
性能及特点:
接口板硬件总线与PCI 协议 V2.1版兼容。
适用于Win98/2000/NT/Windows XP操作系统。
具有即插即用功能。
标准的VISA和GPIB 驱动程序,与NI公司
提供的驱动函数兼容。
适用于 WINDOWS下各种32位编程语言。
如:VC++、 VB、Delphi、LabView、VEE和LabWindows/CVI等。
提供VB、CVI、VC++、 Delphi、LabView编程应用举例。
注意
有些仪器由于其内部gpib接口速度较慢,请在使用过程中发现个别数据读取不当的时候,适当修改以下函数:
kk = setDelayTime(5, 0) ' 0,0为最小延时时间 第一个为延时的毫秒数,第二个为循环的次数。
主要是修改第一个参数。参数值应为比4大的整数。
接口卡的安装
一. win98安装
把接口卡插入计算机,启动计算机,在提示发现PCI桥设备后,在光盘
\Win98\drivers下可以找到.inf文件,安装完接口卡后,找到光盘上的..\Win98\disk1文件夹中的setup.exe程序,进行软件安装。
二. win2000安装
在win2000下安装时,要先进行软件的安装,找到光盘上..\Win2000\Express\SingleImage\DiskImages\DISK1中的setup.exe安装程序运行。软件安装完成后,关机。把接口卡插入计算机,重新启动计算机,再进行接口卡的硬件安装。
硬件安装
一:启动计算机,在提示发现PCI桥设备后在安装路径下的drivers文件夹中可以找到.inf文件!确定,安装完毕。省缺路径为
..\ProgramFiles\HT203\PciIEEE488。
硬件安装方法二:在控制面板中选择添加新硬件,在安装路径下的drivers文件夹中可以找到.inf文件!确定,安装完毕。
三.注意
安装完程序后,要重新启动计算机,才能使用程序。在“开始”菜单pci 488中有本接口的例程,(在win2000操作系统下,在“开始”菜单的Programs中)在要使用例程须将仪器地址设为5,程控命令框中输入相应程控命令!接口程序安装的缺省路径为C:\Program Files\HT203\PciIEEE488,GPIB、VISA文件夹下为接口的动态链接库,Sample文件夹下为各种开发语言的例程,Help文件夹下为帮助文件。
VISA函数和GPIB函数
函数名称:
Visa Resource Template
ViOpena01
viCloseb02
viOpenDefaultRMc03
Visa Instrument Control
ViWrited04
viReade05
viClearf06
viReadSTBg07
viAssertTriggerh08
Visa Resource Template
viLocki09
viUnlockj10
GPIB Function
Sendk11
Receivel12
ReceBlockr18
ReceEOI t19
DevClearm13
Triggern14
WaitSRQp15
ReadStatusByteq16
SendIFC
s17
VISA函数详细说明:
1、viOpen (Sesn1 ,rsrcName,acessMode,timeout,Sesn2)
用途: 打开与指定仪器的通话。
参数说明
Sesn1 输入 资源管理器通话(总应是由viOpenDefaultRM( )返回的VISA默资源理器)。
rsrcName 输入 资源的唯一符号名称
acessMode 输入 指定资源的访问模式。不用,应置0。
timeout 输入 定时时间。默认值为10秒。
Sesn2 输出 通话的唯一逻辑标识符。
返回值: 0
示成功,其余值均表示失败。
注意: rsrcName的格式为:GPIB::Address::INSTR
其中:GPIB:表示GPIB设备。 address:表示GPIB设备地址。
INSTR表示是VISA资源。例如“GPIB::5::INSTR”
各种语言调用说明:
Delph:
Function viOpen(sesn1:Longint;rsrcName:PChar;acessMode:Longint
timeout:Longint;sesn2:PLongint):Longint;
C:
Long viOpen (long sesn1,char *rsrcName, long acessMode, long timeout,long *sesn2)
VB:
Function viOpen (ByVal sesn1 As Long, ByVal rsrcName As String,
ByVal acessMode As Long, ByVal timeout As Long,
sesn2 As Long) As Long
2、viClose(sesn)
用途:
关闭指定的通话。
参数说明
Sesn 输入 通话的唯一逻辑标识符。
返回值:
0表示成功,其余值均表示失败。
各种语言调用说明:
Delphi: Function viClose(sesn:Longint):Longint;
C: Long viClose (long sesn);
VB: Function viClose (ByVal sesn As Long) As Long
3、viOpenDefaultRM (sesn)
用途:
返回与默认资源管理器的通话。
参数说明:
Sesn 输出 与默认资源管理器通话的唯一逻辑标识符。
返回值:
0表示成功,其余值均表示失败。
各种语言调用说明:
a00
Delphi: Function viOpenDefaultRM(sesn1:PLongint):Longint;
C: Long viOpenDefaultRM (long *sesn1);
VB: Function viOpenDefaultRM (sesn1 As Long) As Long
4、viWrite(Sesn ,CommStr ,Count ,retCount )
用途: 向仪器写数据
参数说明:
Sesn 输入 通话的唯一逻辑标识符。
CommStr 输入 表示向仪器传送数据块的存储单元
Count 输入 指定被写的字节数。
retCount 输出 表示设置实际传输的整数字节数存储单元。
返回值:0表示成功,其余值均表示失败。
各种语言调用说明:a00
Delphi: Function viWrite(sesn:Longint;CommStr:PChar;Count:Longint;
retCount:PLongint):Longint;
C: Long viWrite (long sesn, char *CommStr, long Count,
long *retCount)
VB: Function viWrite (ByVal sesn As Long, ByVal CommStr As String,
ByVal Count As Long, lretCount As Long) As Long
5、viRead(Sesn , CommStr , Count , retCount)
用途: 从仪器读数据。
参数说明:
Sesn 输入 通话的唯一逻辑标识符。
CommStr 输入 表示将接收数据的仪器缓冲区的存储单元。
Count 输入 将读取的字节数。
retCount 输出 表示一整数的存储地址,该整数表示实际传输的字节数。
返回值:
0表示成功,其余值均表示失败。
各种语言调用说明:a00
a00
Delphi:
Function viRead(sesn:Longint;ReadData:PChar;Count:Longint;
retCount:PLongint):Longint;
C:
Long viRead (long sesn, char *ReadData, long Count, long *retCount)
VB:
Function viRead (ByVal sesn As Long, ByVal ReadData As String,
ByVal Count As Long, lretCount As Long) As Long
a00
6、viClear(Sesn)
用途: 使一个仪器清零。
参数说明: Sesn 输入 通话的唯一逻辑标识符。
返回值: 0表示成功,其余值均表示失败。
各种语言调用说明:a00
a00
Delphi:
Function viClear(sesn:Longint):Longint;
C:
Long viClear (long sesn)
VB:
Function viClear (ByVal sesn As Long) As Long
7、viReadSTB(Sesn)
用途: 读服务请求的状态字节。
参数说明
Sesn 输入 通话的唯一逻辑标识符。
Status 输出 服务请求的状态字节。
返回值:
0表示成功,其余值均表示失败。
各种语言调用说明: a00
Delphi:
Function ReadSTB(sesn:Longint;status:PSmallint):Longint
C:
Long viReadSTB (long sesn, short *status)
VB:
Function viReadSTB (ByVal sesn As Long,status As Integer) As Long
8、a00
viAssertTrigger(Sesn)
用途: 设置群触发。
参数说明:
Sesn 输入 通话的唯一逻辑标识符。
protocal 输入 断定所用触发协议。不用置0。
返回值:
0表示成功,其余值均表示失败。
各种语言调用说明: a00
a00
Delphi:
Function viAssertTrigger(sesn:Longint;protocal:Integer):Longint;
C:
Long viAssertTrigger (long sesn, int protocal)
VB:
Function vAssertTrigger (ByVal sesn As Long,ByVal protocal As Integer) As Long
9、viLock(Sesn)
用途: 建立对指定资源的访问模式,本函数是本地封锁。
参数说明:
Sesn 输入 通话的唯一逻辑标识符。
lockType 输入 表示请求得锁定类型。不用,置0。
timeout 输入 定时时间,默认识是10秒。
requestedKey 输入 不用,置0。
accessKey 输入 不用,置0。
返回值:
0表示成功,其余值均表示失败。
各种语言调用说明:
a00
Delphi:
Function viLock(sesn,lockType,timeout:Longint;requestedKey,
accessKey:PChar):Longint;
C: Long viLock (long sesn, long lockType, long timeout, char *requestedKey, char *accessKey)
VB: Function viLock (ByVal sesn As Long, ByVal lockType As Long,
ByVal timeout As Long, ByVal requestedKey As String,ByVal accessKey As String) As Long
10、viUnlock (Sesn)
用途: 取消对指定资源的封锁,返回本地。
参数说明:
Sesn 输入 通话的唯一逻辑标识符。
返回值:
0表示成功,其余值均表示失败。
各种语言调用说明:
a00
Delphi: Function viUnlock(sesn:Longint):Longint;
C: Long viUnlock (long sesn)
VB: Function viUnlock (ByVal sesn As Long) As Long
GPIB函数详细说明:
1、Send(Board_Index,evice_Address,Data_Buffer,Byte_Count,EOT_Mode)
用途:
向仪器写数据。
参数说明:
Board_Index 输入 不用,置0。
Device_Address 输入 仪器地址。
Data_Buffer 输入 向仪器传送数据块的存储单元。
Byte_Count 输入 指定被写的字节数。
EOT_Mode 输入 0表示没有数据传输结束标志;
1表示数据串用回车换行结束;
2表示数据用最后一个字符结束。
各种语言调用说明:
Delphi:
Procedure Send(Board_Index:Longint; Device_Address:SmallInt;
Data_Buffer:Pchar;Byte_Count:Longint;
EOT_Mode:Longint);
C:
Void Send(long int Board_Index, short Device_Address, char *Data_Buffer,long int Byte_Count,
long int EOT_Mode);
VB:
Sub Send(ByVal Board_Index As Long, ByVal Device_Address As Short, ByVal Data_Buffer As String,ByVal Byte_Count As Long, ByVal EOT_Mode As Long);
2、Receive(Board_Index,_Address,Buffer,Byte_Count,Terminatin )
用途:
从仪器读数据。
参数说明:
Board_Index 输入 不用,置0。
Device_Address 输入 仪器地址。
Data_Buffer 输出 将接收数据的仪器缓冲区的存储单元
Byte_Count 输入 将读取的字节数。
Termination 输入 不用,置0。
各种语言调用说明:a00
Delphi:
ProcedureReceive(Board_Index:Longint; Device_Address:SmallInt;Data_Buffer:Pchar; Byte_Count:Longint; Termination:Longint);
C:
Void Receive(long int Board_Index, short Device_Address, char *Data_Buffer,long int Byte_Count, long int Termination);
VB:
Sub Receive(ByVal Board_Index As Long, ByVal Device_Address As Short,ByVal Data_Buffer As String,ByVal Byte_Count As Long,
ByVal Termination As Long);
3、DevClear(Board_Index, Device_Address)
用途:
使一个仪器清零。
参数说明:
Board_Index 输入 不用,置0。
Device_Address 输入 仪器地址。
各种语言调用说明:
Delphi:
ProcedureDevClear(Board_Index:Longint;Device_Address:SmallInt);
C:
Void DevClear(long int Board_Index, short Device_Address);
VB:
Sub DevClear(ByVal Board_Index As Long, ByVal Device_Address As Short);
4、Trigger (Board_Index, Device_Address)
用途:
设置群触发。
参数说明:
Board_Index 输入 不用,置0。
Device_Address 输入 仪器地址。
各种语言调用说明:
Delphi:
Procedure
Trigger(Board_Index:Longint;Device_Address:SmallInt);
C:
Void Trigger(long int Board_Index, short Device_Address);
VB:
Sub Trigger(ByVal Board_Index As Long, ByVal Device_Address As Short);
5、WaitSRQ (Board_Index, SRQ_Occurred)
用途:
等待服务请求。
参数说明:
Board_Index 输入 不用,置0。
SRQ_Occurred 输出 0系统默认的timeout时间内无服务请求,
1系统默认的timeout时间有服务请求。
各种语言调用说明:
Delphi:
Procedure WaitSRQ(Board_Index:Longint; SRQ_Occurred:PSmallInt);
C:
Void WaitSRQ(long int Board_Index, short *SRQ_Occurred);
VB:
Sub WaitSRQ(ByVal Board_Index As Long, SRQ_Occurred As Short);
6、ReadStatusByte(Board_Index, Address, Status_Byte )
用途:
读服务请求的状态字节。
参数说明
Board_Index 输入 不用,置0。
Device_Address 输入 仪器地址。
Status_Byte 输出 服务请求的状态字节。
各种语言调用说明:
a00
Delphi:
ProcedureReadStatusByte(Board_Index:Longint; Device_Address:SmallInt;
Status_Byte:PSmallInt);
C:
Void ReadStatusByte(long int Board_Index, short Device_Address,
short *Status_Byte);
VB:
Sub ReadStatusByte(ByVal Board_Index As Long, ByVal Device_Address As Short, Status_Byte As Short);
7、SendIFC (Board_Index)
用途:
接口清除。
参数说明:
Board_Index 输入 不用,置0。
各种语言调用说明:a00
Delphi: Procedure SendIFC(Board_Index:Longint);
C: Void SendIFC(long int Board_Index);
VB: Sub SendIFC(ByVal Board_Index As Long);
8、ReceBlock(Board_Index,_Address,Data_Buffer,Byte_Count,Termination)
用途:
从仪器读数据块。
参数:
名 称 方 向 说 明
Board_Index 输入 不用,置0。
Device_Address输入 仪器地址。
Data_Buffer 输出 表示将接收数据的仪器缓冲区的存储单元
Byte_Count 输入 将读取的字节数。
返回值:
0表示成功,- 1表示失败。
各种语言调用说明:
Delphi: Function ReceBlock(Board_Index:Longint; Device_Address:SmallInt;
Block_Size:Longint;Data_Buffer:PChar);
C: int ReceBlock(long int Board_Index, short Device_Address,
int Block_Size, char *Data_Buffer);
VB: Function ReceBlock(ByVal Board_Index As Integer, ByVal evice_Address As Integer,ByVal Byte_Count As Integer, ByVal Data_Buffer As String);
9、ReceEOI (Board_Index, _Address, Data_Buffer, Byte_Count, Termination)
用途: 以EOI结束方式读仪器数据块。
参数:
名 称 方 向 说 明
Board_Index 输入 不用,置0。
Device_Address输入 仪器地址。
Data_Buffer 输出 表示将接收数据的仪器缓冲区的存储单元
Byte_Count 输入 将读取的字节数。
Termination 输入 不用,置0。
返回值:
0表示成功,- 1表示失败。
各种语言调用说明:
a00
Delphi: Function ReceEOI(Board_Index:Longint; Device_Address:SmallInt;
Data_Buffer:PChar;Byte_Count:PLongint;Termination:Longint
C: int ReceEOI(long int Board_Index, short Device_Address,
char *Data_Buffer,long int *Byte_Count,lng int Termination);
VB: Function ReceEOI(ByVal Board_Index As Integer, ByVal Device_Address As Integer,ByVal Data_Buffer As String, ByRef Byte_Count As Integer,ByVal Termination As Integer);
VISA函数的VB应用示例:
声明:
Declare Function viOpenDefaultRM& Lib "visa32.dll" (sesn1&)
Declare Function viOpen& Lib "visa32.dll" (ByVal sesn1&, ByVal rsrcName$, ByVal acessMode&, ByVal timeout&, sesn2&)
Declare Function viWrite& Lib "visa32.dll" (ByVal sesn&, ByVal CommStr$, ByVal Count&, retCount&)
Declare Function viClose& Lib "visa32.dll" (ByVal sesn&)
Declare Function viRead& Lib "visa32.dll" (ByVal sesn&, ByVal ReadData$, ByVal Count&, retCount&)
Declare Function viClear& Lib "visa32.dll" (ByVal x1&)
Declare Function viLock& Lib "visa32.dll" (ByVal x1&, ByVal x2&, ByVal x3&, ByVal x4$, ByVal x5$)
Declare Function viUnlock& Lib "visa32.dll" (ByVal x1&)
Declare Function viAssertTrigger& Lib "visa32.dll" (ByVal x1&, ByVal x2&)
Declare Function viReadSTB& Lib "visa32.dll" (ByVal x1&, x2%)
程序:
Option Explicit
Public res As String
Public ErrCode As Long
Public visah As Long
Public visah2 As Long
Public datas As String
Public cms As String
Public cmslen As Long
Private Sub Command1_Click() '写数据
Dim i As Long
Dim j As Integer
cms = Text2.Text
cmslen = Len(cms)
ErrCode = viWrite(visah, cms, 10, cmslen)
For i = 1 To 5000
Next i
End Sub
Private Sub Command2_Click()
ErrCode = viClose(visah)
End
End Sub
Private Sub Command3_Click() '读数据
Dim i As Long
Dim j As Integer
datas = String(100, 0)
ErrCode = viRead(visah, datas, 10, cmslen)
Text1.Text = datas
For i = 1 To 10000
Next i
End Sub
Private Sub Command4_Click() '初始化
Dim i As Long
Dim j As Integer
ErrCode = viOpenDefaultRM(visah2)
For i = 1 To 10000
Next i
Command4.Enabled = False
Command1.Enabled = True
Command2.Enabled = True
Command3.Enabled = True
Command5.Enabled = True
End Sub
'Private Sub Command3_Click()
'Dim kk, gg As Integer
'Dim str As String
'str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
'kk = gpib_send(5, Text2.Text)
'gg = gpib_receive(5, str)
'Text1.Text = str
'Text3.Text = kk
'End Sub
'Private Sub Command4_Click()
'Dim dd As Integer
'Text1.Text = fnBB(1, 2)
'Text1.Text = fnCccDll(1, 8)
'End Sub
Private Sub Command5_Click()
Dim i, j As Integer
res = Text3.Text
ErrCode = viOpen(visah2, res, 0, 10, visah)
For i = 1 To 10000
Next i
End Sub
VISA函数的VC应用示例
// DubugIsaDll.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "string.h"
//int gpib_receive(int iAddrDevice,char *receive_buffer);
//__declspec(dllimport) int __stdcall gpib_send(int iAddrDevice,char * sending,int);
//__declspec(dllimport) int __stdcall gpib_receive(int iAddrDevice,char *receive_buffer);
//__declspec(dllimport) void __stdcall gpib_local();
//__declspec(dllimport) void __stdcall gpib_device_clear();
int main(int argc, char* argv[])
{
// int rs;
// char data_buf[3000];
// char aa[5000];
int ErrCode;
int visah;
int visah2;
char datas[5000];
int cmslen;
char * cms = "F0R0X";
char * res = "GPIB::5";
int i,j;
// rs=fnMy111(2,3);
// printf("rs=%d",rs);
// int (*send)(int,char *,int);
// typedef int (__stdcall SEND) (int,int,char *,int,int);
// typedef int (__stdcall RECEIVE) (int,int,char *,int,int);
typedef int (__stdcall OPENDEFAULT) (int *);
typedef int (__stdcall OPEN) (int,char *,int,int,int *);
typedef int (__stdcall WRITE) (int,char *,int,int *);
typedef int (__stdcall CLOSE) (int);
typedef int (__stdcall READ) (int,char *,int,int *);
// SEND * send;
// RECEIVE * receive;
OPENDEFAULT * opendefault;
OPEN * open;
WRITE * write;
READ * read;
CLOSE * close;
// HINSTANCE dllHandle=LoadLibrary("C:\\Program Files\\HT203\\PciIEEE488\\GPIB\\gpib32.dll");
HINSTANCE dllHandle=LoadLibrary("C:\\Program Files\\HT203\\PciIEEE488\\VISA\\visa32.dll");
// HINSTANCE dllHandle=LoadLibrary("D:\\Pcicard\\VISA\\visa32.dll");
// send=(SEND *)GetProcAddress(dllHandle,"Send");
// receive=(RECEIVE *)GetProcAddress(dllHandle,"Receive");
opendefault=(OPENDEFAULT *)GetProcAddress(dllHandle,"viOpenDefaultRM");
open=(OPEN *)GetProcAddress(dllHandle,"viOpen");
write=(WRITE *)GetProcAddress(dllHandle,"viWrite");
read=(READ *)GetProcAddress(dllHandle,"viRead");
close=(CLOSE *)GetProcAddress(dllHandle,"viClose");
cmslen = strlen(cms);
ErrCode = opendefault(&visah2);
for(i=0;i<100000;i++)
for(j=0;j<20;j++)
{}
ErrCode = open(visah2, "GPIB::5", 0, 10, &visah);
for(i=0;i<100000;i++)
for(j=0;j<20;j++)
{}
//在测量中当应用opendefault打开卡资源,open建立连接后,
//可重复使用write 和read 函数完成测量。
ErrCode = write(visah, "F0R0X", 10, &cmslen);
ErrCode = read(visah, datas, 10, &cmslen);
printf("rs is:%s\n",datas);
ErrCode = write(visah, "F1R0X", 10, &cmslen);
ErrCode = read(visah, datas, 10, &cmslen);
printf("rs is:%s\n",datas);
ErrCode = close(visah);
// write(0,5,"F0R0X",0,0);
// receive(0,5,aa,0,0);
// printf("rs is:%s",aa);
FreeLibrary(dllHandle);
// gpib_receive(5,data_buf);
// gpib_local();
// gpib_device_clear();
return 0;
VISA函数的Delphi应用示例
unit loadDll;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
OkBtn: TButton;
CancelBtn: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure OkBtnClick(Sender: TObject);
procedure CancelBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Function viOpenDefaultRM(sesn1:PLongint):Longint;stdcall external 'visa32.dll';
function viOpen(sesn1:Longint;rsrcName:PChar;acessMode:Longint;
timeout:Longint;sesn2:PLongint):Longint;stdcall external 'visa32.dll';
function viWrite(sesn:Longint;CommStr:PChar;Count:Longint;
retCount:PLongint):Longint;stdcall external 'visa32.dll';
function viClose(sesn:Longint):Longint;stdcall
external 'visa32.dll';
function viRead(sesn:Longint;ReadData:PChar;Count:Longint;
retCount:PLongint):Longint;stdcall external 'visa32.dll';
procedure TForm1.OkBtnClick(Sender: TObject);
var
myHandle,temHandle:PLongint;
P1,P2:PChar;
retCount:PLongint;
ReadData:PChar;
i:Integer;
begin
New(myHandle);
New(temHandle);
New(retCount);
P1:=StrAlloc(100*Sizeof(Char));
StrCopy(P1,'GPIB::5::INSTR');
P2:=StrAlloc(100*Sizeof(Char));
StrCopy(P2,PChar(Edit1.Text));
viOpenDefaultRM(myHandle);
viOpen(myHandle^,P1,1,10,temHandle);
viWrite(temHandle^,P2,10,retCount);
ReadData:=StrAlloc(200*Sizeof(Char));
For i:=0 to 200000 do
begin
end;
viRead(temHandle^,ReadData,100,retCount);
Edit2.Text :=ReadData;
viClose(myHandle^);
StrDispose(P1);
StrDispose(P2);
StrDispose(ReadData);
Dispose(retCount);
Dispose(temHandle);
Dispose(myHandle);
end;
VISA函数的LabWindows/CVI应用示例
#include
#include
#include
#include
#include "visa.h"
#include "visa_cvi.h"
#include "stdio.h"
static int panelHandle;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "visa_cvi.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK ExampleBtn (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
long int myHandle,temHandle;
char P1[100],P2[100];
long int retCount;
char ReadData[200];
char CmdStr[200];
switch (event)
{ case EVENT_COMMIT:
//printf("test");
strcpy(P1,"GPIB::5::INSTR");
GetCtrlVal (panelHandle, PANEL_CmdStr,CmdStr);
strcpy(P2,CmdStr);
viOpenDefaultRM(&myHandle);
viOpen(myHandle,P1,1,10,&temHandle);
viWrite(temHandle,P2,10,&retCount);
viReceBlock(temHandle,17,ReadData);
//viRead(temHandle,ReadData,100,&retCount);
SetCtrlVal (panelHandle, PANEL_STRING, ReadData);
viClose(myHandle);
break; }
return 0;}
GPIB函数的VB应用示例
Private Sub Command1_Click()
Dim kk, gg As Integer
Dim str As String
Dim count As Integer
'str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
str = String(50000, 0)
'一般发送和接收的例子
'***************************************
Init
Send 0, 18, "id?;", 0, 0 '“5”是设备地址,"*idn?"是指令串
Receive 0, 18, str, 0, 0 ' str为接收数据缓冲区
Text1.Text = str
'****************************************
'块接收的例子(频谱仪8561系列)
'******************************************
'Init
'Send 0, 18, "FA 100 MHZ;FB 200 MHZ;", 0, 0
'Send 0, 18, "TDF P;TRA?;", 0, 0
'For kk = 0 To 1000 '延时
'Next kk
'gg = ReceBlock(0, 18, 4207, str) "18"是地址,"4207"是接收的字节数,"str"为接收数据缓冲区
'gg = ReceEOI(0, 18, str, count, 0) '"count"是返回的字节数,ReceBlock和ReceEOI两者选一
'返回值gg为零时接收数据完整,-1为错误返回
GPIB函数的VC应用示例
// DynDllDialog.cpp : implementation file
#include "stdafx.h"
#include "Isa2MFCExa.h"
#include "DynDllDialog.h"
#include "windows.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// CDynDllDialog dialog
CDynDllDialog::CDynDllDialog(CWnd* pParent /*=NULL*/)
: CDialog(CDynDllDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CDynDllDialog)
m_iAddr = 5;
m_strCommand = _T("F0R1X");
m_strResult = _T("");
//}}AFX_DATA_INIT
}
void CDynDllDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDynDllDialog)
DDX_Text(pDX, IDC_ADDR, m_iAddr);
DDX_Text(pDX, IDC_CMD, m_strCommand);
DDX_Text(pDX, IDC_RESULT, m_strResult);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDynDllDialog, CDialog)
//{{AFX_MSG_MAP(CDynDllDialog)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CDynDllDialog message handlers
void CDynDllDialog::OnOK()
{
// TODO: Add extra validation here
int rs;
char data_buf[3000];
char aa[3000];
CString strCommand;
int iAddr;
// typedef int (__stdcall SEND) (int,char *,int);
// typedef int (__stdcall RECEIVE) (int,char *);
typedef int (__stdcall SEND) (int,int,char *,int,int);
typedef int (__stdcall RECEIVE) (int,int,char *,int,int);
SEND * send;
RECEIVE * receive;
HINSTANCE dllHandle=LoadLibrary("Gpib32.dll");
send=(SEND *)GetProcAddress(dllHandle,"Send");
receive=(RECEIVE *)GetProcAddress(dllHandle,"Receive");
UpdateData(TRUE);
iAddr=m_iAddr;
strCommand=m_strCommand;
strcpy(data_buf,(const char *)m_strCommand);
rs=send(0,iAddr,data_buf,0,0);
rs=receive(0,iAddr,aa,0,0);
m_strResult=_T(aa);
m_strCommand=strCommand;
m_iAddr=iAddr;
FreeLibrary(dllHandle);
UpdateData(FALSE);
UpdateWindow();
// CDialog::OnOK();
}
GPIB函数的Delphi应用示例
unit loadDll;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
Implementation
procedure Send(Board_Index:Longint;Device_Address:SmallInt;Data_Buffer:PChar;
Byte_Count:Longint;EOT_Mode:Longint);stdcall external 'gpib32.dll';
procedure Receive(Board_Index:Longint;Device_Address:SmallInt;Data_Buffer:PChar;Byte_Count:Longint;Termination:Longint);stdcall external 'gpib32.dll';
procedure TForm1.Button1Click(Sender: TObject);
var P2,readstr:PChar;
i:integer;
begin
P2:=StrAlloc(100*Sizeof(Char));
readstr:=StrAlloc(200*Sizeof(Char));
StrCopy(P2,PChar(Edit2.Text));
Send(0,5,P2,20,0);
sleep(5);
Receive(0,5,readstr,20,0);
Edit1.Text :=readstr;
StrDispose(P2);
StrDispose(readstr);
end;
GPIB函数的LabWindows/CVI应用示例
#include
#include
#include
#include
#include
#include "Gpib_Cvi.h"
#include "stdio.h"
static int panelHandle;
int main (int argc, char *argv[])
{ if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "Gpib_Cvi.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK ExampleBtn (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{ long int myHandle,temHandle;
char P2[100],char ReadData[200];
long int retCount;
switch (event)
{case EVENT_COMMIT:
GetCtrlVal (panelHandle, PANEL_CmdStr,P2);
Send(0,5,P2,20,2);
ReceBlock(0,5,17,ReadData);
SetCtrlVal (panelHandle, PANEL_STRING, ReadData);
strcpy(P2,"");
strcpy(ReadData,"");
break;
}
return 0;}
VB:
Function viRead (ByVal sesn As Long, ByVal ReadData As String,
ByVal Count As Long, lretCount As Long) As Long
a00
6、viClear(Sesn)
用途: 使一个仪器清零。
参数说明: Sesn 输入 通话的唯一逻辑标识符。
返回值: 0表示成功,其余值均表示失败。
各种语言调用说明:a00
a00
Delphi:
Function viClear(sesn:Longint):Longint;
C:
Long viClear (long sesn)
VB:
Function viClear (ByVal sesn As Long) As Long
7、viReadSTB(Sesn)
用途: 读服务请求的状态字节。
参数说明
Sesn 输入 通话的唯一逻辑标识符。
Status 输出 服务请求的状态字节。
返回值:
0表示成功,其余值均表示失败。
各种语言调用说明: a00
Delphi:
Function ReadSTB(sesn:Longint;status:PSmallint):Longint
C:
Long viReadSTB (long sesn, short *status)
VB:
Function viReadSTB (ByVal sesn As Long,status As Integer) As Long
8、a00
viAssertTrigger(Sesn)
用途: 设置群触发。
参数说明:
Sesn 输入 通话的唯一逻辑标识符。
protocal 输入 断定所用触发协议。不用置0。
返回值:
0表示成功,其余值均表示失败。
各种语言调用说明: a00
a00
Delphi:
Function viAssertTrigger(sesn:Longint;protocal:Integer):Longint;
C:
Long viAssertTrigger (long sesn, int protocal)
VB:
Function vAssertTrigger (ByVal sesn As Long,ByVal protocal As Integer) As Long
9、viLock(Sesn)
用途: 建立对指定资源的访问模式,本函数是本地封锁。
参数说明:
Sesn 输入 通话的唯一逻辑标识符。
lockType 输入 表示请求得锁定类型。不用,置0。
timeout 输入 定时时间,默认识是10秒。
requestedKey 输入 不用,置0。
accessKey 输入 不用,置0。
返回值:
0表示成功,其余值均表示失败。
各种语言调用说明:
a00
Delphi:
Function viLock(sesn,lockType,timeout:Longint;requestedKey,
accessKey:PChar):Longint;
C: Long viLock (long sesn, long lockType, long timeout, char *requestedKey, char *accessKey)
VB: Function viLock (ByVal sesn As Long, ByVal lockType As Long,
ByVal timeout As Long, ByVal requestedKey As String,ByVal accessKey As String) As Long
10、viUnlock (Sesn)
用途: 取消对指定资源的封锁,返回本地。
参数说明:
Sesn 输入 通话的唯一逻辑标识符。
返回值:
0表示成功,其余值均表示失败。
各种语言调用说明:
a00
Delphi: Function viUnlock(sesn:Longint):Longint;
C: Long viUnlock (long sesn)
VB: Function viUnlock (ByVal sesn As Long) As Long
GPIB函数详细说明:
1、Send(Board_Index,evice_Address,Data_Buffer,Byte_Count,EOT_Mode)
用途:
向仪器写数据。
参数说明:
Board_Index 输入 不用,置0。
Device_Address 输入 仪器地址。
Data_Buffer 输入 向仪器传送数据块的存储单元。
Byte_Count 输入 指定被写的字节数。
EOT_Mode 输入 0表示没有数据传输结束标志;
1表示数据串用回车换行结束;
2表示数据用最后一个字符结束。
各种语言调用说明:
Delphi:
Procedure Send(Board_Index:Longint; Device_Address:SmallInt;
Data_Buffer:Pchar;Byte_Count:Longint;
EOT_Mode:Longint);
C:
Void Send(long int Board_Index, short Device_Address, char *Data_Buffer,long int Byte_Count,
long int EOT_Mode);
VB:
Sub Send(ByVal Board_Index As Long, ByVal Device_Address As Short, ByVal Data_Buffer As String,ByVal Byte_Count As Long, ByVal EOT_Mode As Long);
2、Receive(Board_Index,_Address,Buffer,Byte_Count,Terminatin )
用途:
从仪器读数据。
参数说明:
Board_Index 输入 不用,置0。
Device_Address 输入 仪器地址。
Data_Buffer 输出 将接收数据的仪器缓冲区的存储单元
Byte_Count 输入 将读取的字节数。
Termination 输入 不用,置0。
各种语言调用说明:a00
Delphi:
ProcedureReceive(Board_Index:Longint; Device_Address:SmallInt;Data_Buffer:Pchar; Byte_Count:Longint; Termination:Longint);
C:
Void Receive(long int Board_Index, short Device_Address, char *Data_Buffer,long int Byte_Count, long int Termination);
VB:
Sub Receive(ByVal Board_Index As Long, ByVal Device_Address As Short,ByVal Data_Buffer As String,ByVal Byte_Count As Long,
ByVal Termination As Long);
3、DevClear(Board_Index, Device_Address)
用途:
使一个仪器清零。
参数说明:
Board_Index 输入 不用,置0。
Device_Address 输入 仪器地址。
各种语言调用说明:
Delphi:
ProcedureDevClear(Board_Index:Longint;Device_Address:SmallInt);
C:
Void DevClear(long int Board_Index, short Device_Address);
VB:
Sub DevClear(ByVal Board_Index As Long, ByVal Device_Address As Short);
4、Trigger (Board_Index, Device_Address)
用途:
设置群触发。
参数说明:
Board_Index 输入 不用,置0。
Device_Address 输入 仪器地址。
各种语言调用说明:
Delphi:
Procedure
Trigger(Board_Index:Longint;Device_Address:SmallInt);
C:
Void Trigger(long int Board_Index, short Device_Address);
VB:
Sub Trigger(ByVal Board_Index As Long, ByVal Device_Address As Short);
5、WaitSRQ (Board_Index, SRQ_Occurred)
用途:
等待服务请求。
参数说明:
Board_Index 输入 不用,置0。
SRQ_Occurred 输出 0系统默认的timeout时间内无服务请求,
1系统默认的timeout时间有服务请求。
各种语言调用说明:
Delphi:
Procedure WaitSRQ(Board_Index:Longint; SRQ_Occurred:PSmallInt);
C:
Void WaitSRQ(long int Board_Index, short *SRQ_Occurred);
VB:
Sub WaitSRQ(ByVal Board_Index As Long, SRQ_Occurred As Short);
6、ReadStatusByte(Board_Index, Address, Status_Byte )
用途:
读服务请求的状态字节。
参数说明
Board_Index 输入 不用,置0。
Device_Address 输入 仪器地址。
Status_Byte 输出 服务请求的状态字节。
各种语言调用说明:
a00
Delphi:
ProcedureReadStatusByte(Board_Index:Longint; Device_Address:SmallInt;
Status_Byte:PSmallInt);
C:
Void ReadStatusByte(long int Board_Index, short Device_Address,
short *Status_Byte);
VB:
Sub ReadStatusByte(ByVal Board_Index As Long, ByVal Device_Address As Short, Status_Byte As Short);
7、SendIFC (Board_Index)
用途:
接口清除。
参数说明:
Board_Index 输入 不用,置0。
各种语言调用说明:a00
Delphi: Procedure SendIFC(Board_Index:Longint);
C: Void SendIFC(long int Board_Index);
VB: Sub SendIFC(ByVal Board_Index As Long);
8、ReceBlock(Board_Index,_Address,Data_Buffer,Byte_Count,Termination)
用途:
从仪器读数据块。
参数:
名 称 方 向 说 明
Board_Index 输入 不用,置0。
Device_Address输入 仪器地址。
Data_Buffer 输出 表示将接收数据的仪器缓冲区的存储单元
Byte_Count 输入 将读取的字节数。
返回值:
0表示成功,- 1表示失败。
各种语言调用说明:
Delphi: Function ReceBlock(Board_Index:Longint; Device_Address:SmallInt;
Block_Size:Longint;Data_Buffer:PChar);
C: int ReceBlock(long int Board_Index, short Device_Address,
int Block_Size, char *Data_Buffer);
VB: Function ReceBlock(ByVal Board_Index As Integer, ByVal evice_Address As Integer,ByVal Byte_Count As Integer, ByVal Data_Buffer As String);
9、ReceEOI (Board_Index, _Address, Data_Buffer, Byte_Count, Termination)
用途: 以EOI结束方式读仪器数据块。
参数:
名 称 方 向 说 明
Board_Index 输入 不用,置0。
Device_Address输入 仪器地址。
Data_Buffer 输出 表示将接收数据的仪器缓冲区的存储单元
Byte_Count 输入 将读取的字节数。
Termination 输入 不用,置0。
返回值:
0表示成功,- 1表示失败。
各种语言调用说明:
a00
Delphi: Function ReceEOI(Board_Index:Longint; Device_Address:SmallInt;
Data_Buffer:PChar;Byte_Count:PLongint;Termination:Longint
C: int ReceEOI(long int Board_Index, short Device_Address,
char *Data_Buffer,long int *Byte_Count,lng int Termination);
VB: Function ReceEOI(ByVal Board_Index As Integer, ByVal Device_Address As Integer,ByVal Data_Buffer As String, ByRef Byte_Count As Integer,ByVal Termination As Integer);
VISA函数的VB应用示例:
声明:
Declare Function viOpenDefaultRM& Lib "visa32.dll" (sesn1&)
Declare Function viOpen& Lib "visa32.dll" (ByVal sesn1&, ByVal rsrcName$, ByVal acessMode&, ByVal timeout&, sesn2&)
Declare Function viWrite& Lib "visa32.dll" (ByVal sesn&, ByVal CommStr$, ByVal Count&, retCount&)
Declare Function viClose& Lib "visa32.dll" (ByVal sesn&)
Declare Function viRead& Lib "visa32.dll" (ByVal sesn&, ByVal ReadData$, ByVal Count&, retCount&)
Declare Function viClear& Lib "visa32.dll" (ByVal x1&)
Declare Function viLock& Lib "visa32.dll" (ByVal x1&, ByVal x2&, ByVal x3&, ByVal x4$, ByVal x5$)
Declare Function viUnlock& Lib "visa32.dll" (ByVal x1&)
Declare Function viAssertTrigger& Lib "visa32.dll" (ByVal x1&, ByVal x2&)
Declare Function viReadSTB& Lib "visa32.dll" (ByVal x1&, x2%)
程序:
Option Explicit
Public res As String
Public ErrCode As Long
Public visah As Long
Public visah2 As Long
Public datas As String
Public cms As String
Public cmslen As Long
Private Sub Command1_Click() '写数据
Dim i As Long
Dim j As Integer
cms = Text2.Text
cmslen = Len(cms)
ErrCode = viWrite(visah, cms, 10, cmslen)
For i = 1 To 5000
Next i
End Sub
Private Sub Command2_Click()
ErrCode = viClose(visah)
End
End Sub
Private Sub Command3_Click() '读数据
Dim i As Long
Dim j As Integer
datas = String(100, 0)
ErrCode = viRead(visah, datas, 10, cmslen)
Text1.Text = datas
For i = 1 To 10000
Next i
End Sub
Private Sub Command4_Click() '初始化
Dim i As Long
Dim j As Integer
ErrCode = viOpenDefaultRM(visah2)
For i = 1 To 10000
Next i
Command4.Enabled = False
Command1.Enabled = True
Command2.Enabled = True
Command3.Enabled = True
Command5.Enabled = True
End Sub
'Private Sub Command3_Click()
'Dim kk, gg As Integer
'Dim str As String
'str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
'kk = gpib_send(5, Text2.Text)
'gg = gpib_receive(5, str)
'Text1.Text = str
'Text3.Text = kk
'End Sub
'Private Sub Command4_Click()
'Dim dd As Integer
'Text1.Text = fnBB(1, 2)
'Text1.Text = fnCccDll(1, 8)
'End Sub
Private Sub Command5_Click()
Dim i, j As Integer
res = Text3.Text
ErrCode = viOpen(visah2, res, 0, 10, visah)
For i = 1 To 10000
Next i
End Sub
VISA函数的VC应用示例
// DubugIsaDll.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "string.h"
//int gpib_receive(int iAddrDevice,char *receive_buffer);
//__declspec(dllimport) int __stdcall gpib_send(int iAddrDevice,char * sending,int);
//__declspec(dllimport) int __stdcall gpib_receive(int iAddrDevice,char *receive_buffer);
//__declspec(dllimport) void __stdcall gpib_local();
//__declspec(dllimport) void __stdcall gpib_device_clear();
int main(int argc, char* argv[])
{
// int rs;
// char data_buf[3000];
// char aa[5000];
int ErrCode;
int visah;
int visah2;
char datas[5000];
int cmslen;
char * cms = "F0R0X";
char * res = "GPIB::5";
int i,j;
// rs=fnMy111(2,3);
// printf("rs=%d",rs);
// int (*send)(int,char *,int);
// typedef int (__stdcall SEND) (int,int,char *,int,int);
// typedef int (__stdcall RECEIVE) (int,int,char *,int,int);
typedef int (__stdcall OPENDEFAULT) (int *);
typedef int (__stdcall OPEN) (int,char *,int,int,int *);
typedef int (__stdcall WRITE) (int,char *,int,int *);
typedef int (__stdcall CLOSE) (int);
typedef int (__stdcall READ) (int,char *,int,int *);
// SEND * send;
// RECEIVE * receive;
OPENDEFAULT * opendefault;
OPEN * open;
WRITE * write;
READ * read;
CLOSE * close;
// HINSTANCE dllHandle=LoadLibrary("C:\\Program Files\\HT203\\PciIEEE488\\GPIB\\gpib32.dll");
HINSTANCE dllHandle=LoadLibrary("C:\\Program Files\\HT203\\PciIEEE488\\VISA\\visa32.dll");
// HINSTANCE dllHandle=LoadLibrary("D:\\Pcicard\\VISA\\visa32.dll");
// send=(SEND *)GetProcAddress(dllHandle,"Send");
// receive=(RECEIVE *)GetProcAddress(dllHandle,"Receive");
opendefault=(OPENDEFAULT *)GetProcAddress(dllHandle,"viOpenDefaultRM");
open=(OPEN *)GetProcAddress(dllHandle,"viOpen");
write=(WRITE *)GetProcAddress(dllHandle,"viWrite");
read=(READ *)GetProcAddress(dllHandle,"viRead");
close=(CLOSE *)GetProcAddress(dllHandle,"viClose");
cmslen = strlen(cms);
ErrCode = opendefault(&visah2);
for(i=0;i<100000;i++)
for(j=0;j<20;j++)
{}
ErrCode = open(visah2, "GPIB::5", 0, 10, &visah);
for(i=0;i<100000;i++)
for(j=0;j<20;j++)
{}
//在测量中当应用opendefault打开卡资源,open建立连接后,
//可重复使用write 和read 函数完成测量。
ErrCode = write(visah, "F0R0X", 10, &cmslen);
ErrCode = read(visah, datas, 10, &cmslen);
printf("rs is:%s\n",datas);
ErrCode = write(visah, "F1R0X", 10, &cmslen);
ErrCode = read(visah, datas, 10, &cmslen);
printf("rs is:%s\n",datas);
ErrCode = close(visah);
// write(0,5,"F0R0X",0,0);
// receive(0,5,aa,0,0);
// printf("rs is:%s",aa);
FreeLibrary(dllHandle);
// gpib_receive(5,data_buf);
// gpib_local();
// gpib_device_clear();
return 0;
VISA函数的Delphi应用示例
unit loadDll;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
OkBtn: TButton;
CancelBtn: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure OkBtnClick(Sender: TObject);
procedure CancelBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Function viOpenDefaultRM(sesn1:PLongint):Longint;stdcall external 'visa32.dll';
function viOpen(sesn1:Longint;rsrcName:PChar;acessMode:Longint;
timeout:Longint;sesn2:PLongint):Longint;stdcall external 'visa32.dll';
function viWrite(sesn:Longint;CommStr:PChar;Count:Longint;
retCount:PLongint):Longint;stdcall external 'visa32.dll';
function viClose(sesn:Longint):Longint;stdcall
external 'visa32.dll';
function viRead(sesn:Longint;ReadData:PChar;Count:Longint;
retCount:PLongint):Longint;stdcall external 'visa32.dll';
procedure TForm1.OkBtnClick(Sender: TObject);
var
myHandle,temHandle:PLongint;
P1,P2:PChar;
retCount:PLongint;
ReadData:PChar;
i:Integer;
begin
New(myHandle);
New(temHandle);
New(retCount);
P1:=StrAlloc(100*Sizeof(Char));
StrCopy(P1,'GPIB::5::INSTR');
P2:=StrAlloc(100*Sizeof(Char));
StrCopy(P2,PChar(Edit1.Text));
viOpenDefaultRM(myHandle);
viOpen(myHandle^,P1,1,10,temHandle);
viWrite(temHandle^,P2,10,retCount);
ReadData:=StrAlloc(200*Sizeof(Char));
For i:=0 to 200000 do
begin
end;
viRead(temHandle^,ReadData,100,retCount);
Edit2.Text :=ReadData;
viClose(myHandle^);
StrDispose(P1);
StrDispose(P2);
StrDispose(ReadData);
Dispose(retCount);
Dispose(temHandle);
Dispose(myHandle);
end;
VISA函数的LabWindows/CVI应用示例
#include
#include
#include
#include
#include "visa.h"
#include "visa_cvi.h"
#include "stdio.h"
static int panelHandle;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "visa_cvi.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK ExampleBtn (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
long int myHandle,temHandle;
char P1[100],P2[100];
long int retCount;
char ReadData[200];
char CmdStr[200];
switch (event)
{ case EVENT_COMMIT:
//printf("test");
strcpy(P1,"GPIB::5::INSTR");
GetCtrlVal (panelHandle, PANEL_CmdStr,CmdStr);
strcpy(P2,CmdStr);
viOpenDefaultRM(&myHandle);
viOpen(myHandle,P1,1,10,&temHandle);
viWrite(temHandle,P2,10,&retCount);
viReceBlock(temHandle,17,ReadData);
//viRead(temHandle,ReadData,100,&retCount);
SetCtrlVal (panelHandle, PANEL_STRING, ReadData);
viClose(myHandle);
break; }
return 0;}
GPIB函数的VB应用示例
Private Sub Command1_Click()
Dim kk, gg As Integer
Dim str As String
Dim count As Integer
'str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
str = String(50000, 0)
'一般发送和接收的例子
'***************************************
Init
Send 0, 18, "id?;", 0, 0 '“5”是设备地址,"*idn?"是指令串
Receive 0, 18, str, 0, 0 ' str为接收数据缓冲区
Text1.Text = str
'****************************************
'块接收的例子(频谱仪8561系列)
'******************************************
'Init
'Send 0, 18, "FA 100 MHZ;FB 200 MHZ;", 0, 0
'Send 0, 18, "TDF P;TRA?;", 0, 0
'For kk = 0 To 1000 '延时
'Next kk
'gg = ReceBlock(0, 18, 4207, str) "18"是地址,"4207"是接收的字节数,"str"为接收数据缓冲区
'gg = ReceEOI(0, 18, str, count, 0) '"count"是返回的字节数,ReceBlock和ReceEOI两者选一
'返回值gg为零时接收数据完整,-1为错误返回
GPIB函数的VC应用示例
// DynDllDialog.cpp : implementation file
#include "stdafx.h"
#include "Isa2MFCExa.h"
#include "DynDllDialog.h"
#include "windows.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// CDynDllDialog dialog
CDynDllDialog::CDynDllDialog(CWnd* pParent /*=NULL*/)
: CDialog(CDynDllDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CDynDllDialog)
m_iAddr = 5;
m_strCommand = _T("F0R1X");
m_strResult = _T("");
//}}AFX_DATA_INIT
}
void CDynDllDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDynDllDialog)
DDX_Text(pDX, IDC_ADDR, m_iAddr);
DDX_Text(pDX, IDC_CMD, m_strCommand);
DDX_Text(pDX, IDC_RESULT, m_strResult);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDynDllDialog, CDialog)
//{{AFX_MSG_MAP(CDynDllDialog)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CDynDllDialog message handlers
void CDynDllDialog::OnOK()
{
// TODO: Add extra validation here
int rs;
char data_buf[3000];
char aa[3000];
CString strCommand;
int iAddr;
// typedef int (__stdcall SEND) (int,char *,int);
// typedef int (__stdcall RECEIVE) (int,char *);
typedef int (__stdcall SEND) (int,int,char *,int,int);
typedef int (__stdcall RECEIVE) (int,int,char *,int,int);
SEND * send;
RECEIVE * receive;
HINSTANCE dllHandle=LoadLibrary("Gpib32.dll");
send=(SEND *)GetProcAddress(dllHandle,"Send");
receive=(RECEIVE *)GetProcAddress(dllHandle,"Receive");
UpdateData(TRUE);
iAddr=m_iAddr;
strCommand=m_strCommand;
strcpy(data_buf,(const char *)m_strCommand);
rs=send(0,iAddr,data_buf,0,0);
rs=receive(0,iAddr,aa,0,0);
m_strResult=_T(aa);
m_strCommand=strCommand;
m_iAddr=iAddr;
FreeLibrary(dllHandle);
UpdateData(FALSE);
UpdateWindow();
// CDialog::OnOK();
}
GPIB函数的Delphi应用示例
unit loadDll;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
Implementation
procedure Send(Board_Index:Longint;Device_Address:SmallInt;Data_Buffer:PChar;
Byte_Count:Longint;EOT_Mode:Longint);stdcall external 'gpib32.dll';
procedure Receive(Board_Index:Longint;Device_Address:SmallInt;Data_Buffer:PChar;Byte_Count:Longint;Termination:Longint);stdcall external 'gpib32.dll';
procedure TForm1.Button1Click(Sender: TObject);
var P2,readstr:PChar;
i:integer;
begin
P2:=StrAlloc(100*Sizeof(Char));
readstr:=StrAlloc(200*Sizeof(Char));
StrCopy(P2,PChar(Edit2.Text));
Send(0,5,P2,20,0);
sleep(5);
Receive(0,5,readstr,20,0);
Edit1.Text :=readstr;
StrDispose(P2);
StrDispose(readstr);
end;
GPIB函数的LabWindows/CVI应用示例
#include
#include
#include
#include
#include
#include "Gpib_Cvi.h"
#include "stdio.h"
static int panelHandle;
int main (int argc, char *argv[])
{ if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "Gpib_Cvi.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK ExampleBtn (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{ long int myHandle,temHandle;
char P2[100],char ReadData[200];
long int retCount;
switch (event)
{case EVENT_COMMIT:
GetCtrlVal (panelHandle, PANEL_CmdStr,P2);
Send(0,5,P2,20,2);
ReceBlock(0,5,17,ReadData);
SetCtrlVal (panelHandle, PANEL_STRING, ReadData);
strcpy(P2,"");
strcpy(ReadData,"");
break;
}
return 0;}