使用 C 接口 Rigol 示波器






4.73/5 (9投票s)
本文介绍如何开发能够访问和控制 Rigol 示波器的 C 语言应用程序。
引言
随着示波器功能日新月异,理解其所有按钮、旋钮和菜单变得越来越困难。但如果您能编写PC应用程序来连接示波器,那么您无需了解其前面板即可执行精确、复杂的测试。您还可以控制测量数据如何以及何时传输到计算机。
本文介绍如何编写访问 Rigol 示波器大部分(但非全部)功能的应用程序。具体来说,我的开发环境是在 Windows PC 上运行的 Visual Studio 2012,连接到 Rigol DS1104Z。但本文内容应适用于其他操作系统和测试仪器。
1. Rigol 示波器接口概述
Rigol Technologies 在其网站上为其每款示波器提供驱动程序包。如果您将其安装在 Windows 7 计算机上,C:\Program Files (x86) 目录下将有一个名为 IVI Foundation 的目录。其中包含构建本文所述应用程序所需的库和头文件。
一个特别重要的文件是 visa32.lib,它位于 IVI Foundation\VISA\WinNT\lib\msc 目录下。该库中的函数使得接口兼容的测试仪器成为可能。这些函数在 visa.h 中声明,该文件位于 IVI Foundation\VISA\WinNT\include 目录下。下一节将解释如何在应用程序中使用这些函数,但在此之前,我想简要解释一下 IVI 是什么以及它与 VISA 的关系。
IVI 是 Interchangeable Virtual Instruments(可互换虚拟仪器)的缩写,IVI Foundation 管理着规范,这些规范定义了如何在软件中访问测试仪器。该联盟的当前成员包括 Tektronix、Keithley Instruments、National Instruments 和 Rohde & Schwartz。
最重要的 IVI 规范之一是 Virtual Instrument Software Architecture(虚拟仪器软件架构)标准,简称为 VISA。如果测试仪器符合 VISA 标准,您就可以使用 VISA 标准中定义的软件例程和数据结构通过 PC 应用程序进行访问。
2. VISA 函数
当前版本的 VISA 规范是 VPP-4.3 标准,修订版 5.4。PDF 可在此处下载。该标准使用一组特定的术语来描述测试仪器及其 PC 接口。以下是三个重要术语:
- 资源 (Resource) - 代表一个测试仪器,例如 Rigol 示波器
- 资源管理器 (Resource manager) - 可用于查找、打开和关闭资源的数据对象(数据对象)
- 会话 (Session) - PC 与资源管理器之间或 PC 与资源之间的通信路径
使用这些术语,在软件中接口符合 VISA 标准的示波器的过程包括五个步骤:
- 使用
viOpenDefaultRM
打开与资源管理器通信的会话 (ViSession
)。 - 使用
viFindRsrc
访问资源 (ViRsrc
)。 - 使用
viOpen
打开与资源通信的会话 (ViSession
)。 - 使用
viWrite
向资源发送命令,并使用viRead
将数据读回 PC。 - 使用
viClose
关闭会话。
为了说明这些函数如何被调用,表 1 列出了十个 VISA 函数的签名并提供了每个函数的描述。VISA 标准定义的函数不止这些,但这些是接口示波器所需的核心函数。
函数名 | 描述 |
---|---|
viOpenDefaultRM(ViSession) |
打开一个会话以与资源管理器通信 |
viFindRsrc(ViSession, String, ViFindList, ViUInt32, ViRsrc) |
访问满足给定条件的第一个资源 |
viOpen(ViSession, ViRsrc, ViAccessMode, uint32, ViSession) |
打开一个会话以与资源通信 |
viWrite(ViSession, ViBuf, uint32, uint32) |
同步将缓冲区中的数据写入资源 |
viWriteAsync(ViSession, viBuf, uint32, viJobId) |
异步将缓冲区中的数据写入资源 |
viWriteFromFile(ViSession, string, uint32, uint32) |
同步将文件中的数据写入资源 |
viRead(ViSession, ViBuf, uint32, uint32) |
同步将数据从资源读取到缓冲区 |
viReadAsync(ViSession, ViBuf, uint32, ViJobId) |
异步将数据从资源读取到缓冲区 |
viReadToFile(ViSession, string, uint32, uint32) |
同步将数据从资源读取到文件 |
viClose(ViSession) |
关闭与资源管理器的会话 |
viFindRsrc
的第二个参数设置资源管理器用于选择资源的条件。此字符串的格式很复杂,但如果示波器通过 USB 连接到 PC,则字符串 USB?*INSTR
就足以访问示波器。
例如,以下代码访问第一个符合 USB?*INSTR 条件的连接资源。它调用 viWrite
发送命令 (:IDN?
),并调用 viRead
读取设备的标识字符串。
#include <stdio.h>
#include <string.h>
#include <visa.h>
int main() {
ViSession rmSession, scopeSession;
ViFindList resourceList;
ViUInt32 numResources;
char readStr[512];
char usbResource[VI_FIND_BUFLEN];
// Open session with the resource manager
viOpenDefaultRM(&rmSession);
// Find USB resources
viFindRsrc(rmSession, "USB?*INSTR", &resourceList, &numResources, usbResource);
// Open session to the resource
viOpen(rmSession, usbResource, VI_NULL, VI_NULL, &scopeSession);
// Send a command to the resource
viWrite(scopeSession, (ViBuf)"*IDN?\n", 512, VI_NULL);
// Read the response
viRead(scopeSession, (ViBuf)readStr, 512, VI_NULL);
// Print the ID string
printf("Resource ID: %s\n", readStr);
// Close the session to the resource
viClose(scopeSession);
// Close the session to the resource manager
viClose(rmSession);
return 0;
}
当 Rigol 示波器收到 *IDN?
命令时,它会向 ViRead
返回完整的标识字符串。这包括设备的名称、型号和序列号。
3. Rigol 命令概述
VISA 函数使得向测试仪器发送命令并读回响应成为可能。编写测试应用程序的难点在于理解可用的众多命令。笼统地说,它们可以分为两类:IEEE-488.2 命令和 Rigol 特定命令。Rigol 特定命令还可以根据命令字符串的性质进一步细分。图 1 展示了这些类别的大致样子。
图 1:按语法划分的命令类别
IEEE-488 标准于 20 世纪 60 年代末创建,用于定义访问通过通用接口总线 (GPIB) 连接的测试仪器的命令。每个命令都以星号开头,前面的示例使用 *IDN?
来查询标识字符串。同样,*RST
会重置仪器,*TST
会执行自检。*OPC?
用于检查当前操作是否仍在继续,*WAI
用于等待操作完成。了解这些命令很有用,但我在测试应用程序中很少使用它们。
Rigol 在 IEEE-488 命令的基础上,添加了专门用于接口 Rigol 示波器的命令。关于这些命令有三点需要理解:
- 每个命令都以冒号开头,后面跟着大写字母。在本文中,如果一个命令被写成
:CLEar
或:TIMebase
,只有大写字母是重要的。附加的字母是为了清晰起见而打印的。 - 以问号结尾的命令是查询命令。它从仪器中读取(获取)信息。
- 初始命令名称后面可以跟限定符,每个限定符都以冒号开头。例如:
:CHANnel2:SCALe
和:TIMebase:DELay:ENABle
。带限定符的命令称为复杂命令,不带限定符的命令称为简单语句。没有简单的查询。
以下各节将更详细地介绍简单语句和复杂命令。
4. 简单语句
Rigol 的简单语句用于告诉示波器执行一个操作。表 2 列出了所有六个简单语句并提供了描述。
声明 | 描述 |
---|---|
:RUN |
告诉示波器等待触发并开始测量 |
:STOP |
停止示波器的运行 |
:CLEar | 清除屏幕上的波形 |
:SINGle | 设置单次触发模式(见下文) |
:TFORce | 强制触发条件 |
:AUToscale | 告诉示波器根据输入信号配置垂直刻度、水平刻度 (时基)和触发器 |
这些语句很容易理解。重要的是要看到 :RUN
并不一定意味着让示波器进行测量和记录数据。它告诉示波器等待触发条件,届时它将开始测量。测量完成后,示波器将等待下一次触发,除非将其置于单次触发模式 (:SINGle
)。
触发条件可以通过多种方式配置,这将在后面的章节中解释。如果您希望示波器在不等待的情况下开始测量,:TFORce
会强制触发条件。
- 配置示波器的运行(垂直/水平刻度、数据采集、触发器、波形)
:RUN
告诉示波器等待触发- (等待足够的时间使测量完成)
:STOP
告诉示波器停止运行:WAVeform:DATA?
将测量数据读回 PC
:AUToscale
命令轻松完成,该命令的功能与 AUTO 按钮相同。但 Rigol 提供了许多命令来定制示波器的运行。以下各节将解释如何配置仪器的通道、水平刻度(时基)、数据采集、触发条件和波形。我不会列出所有可用的命令,只列出我认为有用的命令。要获取完整的命令列表,我推荐 Rigol 的 DS1000Z 编程指南。5. 通道配置
在 Rigol 的术语中,通道是能够接收信号的输入。大多数 Rigol 示波器有四个通道,每个通道都可以通过 :
CHANnel<n>
,单独配置,其中 <n> 表示通道号(1-4)。例如,以 :CHAN3
开头的命令适用于第三个通道。
所有通道配置命令都是复杂命令,这意味着 :
CHANnel<n>
后面会跟限定符,这些限定符决定了命令的操作。通道命令有两种通用形式:
-
:CHANnel<n>:<spec>?
- 返回配置值 -
:CHANnel<n>:<spec> <arg>
- 设置配置为由 <arg>确定的值(确定的值)
表 3 列出了可与 :
CHANnel<n>
命令一起使用的限定符。对于每个限定符,表格列出了可能的参数和描述。
限定符 | 参数 | 描述 | |
---|---|---|---|
:UNITs |
VOLTage , WATT ,AMPere , UNKnown |
获取/设置通道测量的单位 | |
:DISPLAY |
0/OFF 或 1/ON |
获取/设置通道是否在示波器上显示 | |
:BWLimit | 20M 或 OFF |
获取/设置是否启用 20 MHz 带宽限制 | |
:COUPling | AC , DC , 或 GND |
获取/设置是否阻止交流和直流分量 (GND), |
|
:INVert | 0/OFF 或 1/ON |
获取/设置显示模式是否反转 | |
:TCAL | -100 到 100 |
获取/设置校准零偏置所需的时间 | |
:PROBe |
0.01 , 0.02 , 0.05 ,0.1 , 0.2 , 0.5 , 1 ,2 , 5 , 10 , 20 , 50 ,100 , 200 , 500 , 1000 |
获取/设置探头比率 | |
:VERNier |
0/OFF 或 1/ON |
获取/设置是否启用垂直刻度的微调 | |
:SCALe |
见下文 | 获取/设置垂直刻度 | |
:OFFSet |
见下文 | 获取/设置输入信号的垂直偏移 | |
:RANGe |
见下文 | 获取/设置垂直范围 |
其中大部分条目都很直接,但涉及探头和垂直刻度的条目可能难以理解。首先,区分物理探头的衰减和示波器的探头比率很重要。
随 Rigol 示波器附带的物理探头有一个按钮,可将衰减设置为 1x 或 10x。物理探头的默认设置为 10x,这意味着探头会将输入信号减小十倍。示波器不知道物理探头的衰减,因此它会乘以探头比率来补偿探头的衰减。由于默认物理探头衰减为 10x,因此示波器的默认探头比率为 10,它会放大输入信号十倍。
每个通道的探头比率都可以单独配置。如果通道的探头比率为 5,而物理探头的衰减为 10x,则显示的信号强度将是实际信号的一半。如果探头比率为 20,则显示的信号强度将是实际信号的两倍。以下命令将通道 2 的探头比率设置为 20:
:CHAN2:PROB 20
垂直刻度设置显示中每格的伏特数。当通道的探头比率改变时,垂直刻度会反向改变。也就是说,如果探头比率乘以 x,则刻度除以 x。
垂直刻度使用 :SCALe
设置,可接受的刻度值范围取决于探头比率。
- 如果探头比率为
1
,刻度可以在 1mV 和 10 V 之间设置 - 如果探头比率为
10
,刻度可以在 10mV 和 100 V 之间设置
默认情况下,如果探头比率为 1,则刻度可以以 1-2-5 的增量设置,例如 1mV、2mV、5mV 和 10mV、20mV、50mV。但是,如果 :VERNier
设置为 1
或 ON
,则可以以更小的增量调整垂直刻度。
:OFFSet
命令获取或设置输入信号的偏移。偏移的范围取决于通道的探头比率和垂直刻度。
-
如果探头比率为
1
且垂直刻度大于 500 mV/division,则偏移可以在 -100V 和 100V 之间设置。 -
如果探头比率为
1
且垂直刻度小于 500 mV/division,则偏移可以在 -2V 和 2V 之间设置。 -
Rigol 的文档没有给出探头比率为 10 时的偏移范围,但可以安全地假设偏移可以在 -100V 和 100V 之间设置。
理解 :SCALe
和 :RANGe
之间的区别很重要。:SCALe
命令获取或设置每格的伏特数。:RANGe
命令获取或设置显示器中可呈现的伏特数。如果示波器只能显示八格,则其垂直范围等于垂直刻度的八倍。
如前所述,如果探头比率设置为 1
,则通道的垂直刻度可以在 1mV 和 10V 之间设置。由于垂直范围是刻度的八倍,因此当探头比率为 1 时,垂直范围可以在 8mV 和 80V 之间设置。
6. 时基配置
通道命令配置垂直显示,时基命令配置水平显示。有一个重要的区别:通道命令只影响一个通道,而时基命令影响所有通道。
时基命令以 :TIMebase
开头。表 4 列出了其限定符和可能的参数。
限定符 | 参数 | 描述 | |
---|---|---|---|
:MODE |
MAIN , XY , 或 ROLL |
获取/设置输入信号的显示方式 | |
[:MAIN]:SCALe | 主模式:5ns 到 50s 滚动模式:200ms 到 50s |
获取/设置水平时间刻度(扫描速度) | |
[:MAIN]:OFFSet | -屏幕/2 到 1s 或 -屏幕/2 到 5000s |
获取/设置水平偏移 | |
:DELay:ENABle | 0/OFF 或 1/ON |
获取/设置延迟扫描 |
|
:DELay:OFFSet | -(LeftTime - Range/2) -(RightTime - Range/2) |
获取/设置延迟的时间基偏移 | |
:DELay:SCALe | 见下文 |
获取/设置延迟时间基刻度(秒/格) |
关于 :MODE
命令,主模式 (MAIN
) 被称为 YT 模式,因为 y 轴代表电压,x 轴代表时间。在 XY
模式下,同时显示两个通道:第一个通道垂直显示,第二个通道水平显示。在 ROLL
模式下,波形从右向左移动,显示全扫描结果。
跟踪在屏幕上移动的过程称为扫描。扫描速度由水平刻度决定,该刻度设置每格的秒数。:SCALe
命令设置此值,值范围取决于模式。对于所有刻度,值都限于 1-2-5 三个增量,例如 1s、2s、5s 或 10s、20s 或 50s。
在 MAIN
模式下,延迟扫描可以在经过一段时间间隔后观察信号。:DELay:ENABle
命令启用此功能,:DELay:OFFSet
设置时间间隔。:DELay:SCALe
命令可以放大延迟信号。延迟信号的最大刻度等于主水平刻度的最大值。
7. 数据采集配置
:ACQuire
命令与示波器的采样率和每次运行存储的样本数有关。表 5 列出了可用的命令。
限定符 | 参数 | 描述 | |
---|---|---|---|
:SRATe |
-- | 获取示波器 每秒可读取的样本数 |
|
:MDEPth | 见下文 | 获取/设置测量期间 要存储的波形点数 |
|
:TYPE | NORMal , AVERages ,PEAK , HRESolution |
获取/设置示波器如何采样输入信号 signal |
|
:AVERages | 2^n (n 在 1 到 10 之间) |
指定要平均的样本数 |
示波器的采样率表示它每秒可以读取多少信号值。此速率无法使用 Rigol 命令更改,但可以使用 :SRATe?
命令读取。使用更多通道时,采样率会降低。
内存深度是指单次触发采样中可存储的样本数。默认情况下,内存深度通过以下公式获得:
内存深度 = 采样率 x 波形长度
对于自定义设置,可能的样本数取决于活动通道数:
-
1 个通道:12000, 120000, 1200000, 12000000, 24000000
-
2 个通道:6000, 60000, 600000, 6000000, 12000000
-
4 个通道:3000, 30000, 300000, 3000000, 6000000
示波器可以通过四种方式对输入信号进行采样:
-
NORMal
- 以相等的时间间隔采样 -
AVERages
- 通过记录输入信号的平均值来降低噪声 -
PEAK
- 获取间隔内的最小值和最大值 -
高分辨率 (
HRESolution
) - 使用超采样对相邻点进行平均以降低随机噪声
:TYPE
命令用于指定使用哪种采样方法。如果选择了 AVERages
模式,:AVERages
会告诉示波器应该将多少样本平均在一起。
8. 触发配置
当满足触发条件时,示波器开始读取信号数据。要在应用程序中设置触发条件,通常需要两个步骤:
- 使用适当的触发模式调用
:TRIGger:MODE
命令。 - 调用特定于所选模式的
:TRIGger
命令。
Rigol 示波器支持十五种触发模式,并且有大量的模式特定命令。因此,本文的讨论仅限于介绍这十五种模式,如表 6 所示。
触发模式 | 描述 | |
---|---|---|
EDGE | 在输入信号的指定边沿触发 | |
PULSe | 在给定宽度的正/负脉冲上触发 | |
WINDow |
当输入通过高输入触发电平或低触发电平时触发 | |
NEDG |
在指定空闲时间后的第 n 个边沿触发 | |
RUNT |
当信号通过一个触发电平但未能通过另一个触发电平时触发 | |
SLOPe |
在给定时间内的正/负斜率上触发 | |
VIDeo |
在视频信号场上触发 | |
PATTern |
在两个通道的 AND 组合上触发 | |
DELay |
当两个边沿之间的时间差满足预设时间限制时触发 | |
TIMeout |
当信号的上升/下降沿到相邻下降/上升沿的时间间隔通过触发电平时触发 | |
DURation |
在给定持续时间内对指定模式触发 | |
SHOLd |
当设置/保持时间内的内部状态因逻辑数据输入而改变时触发 | |
RS232 |
根据起始帧、错误帧、校验错误或数据进行触发 | |
IIC |
根据特定地址和数据值的起始条件、重新启动、停止、丢失的 ACK 或读/写帧触发 | |
SPI | 根据 SPI 数据模式触发 |
举例来说,我们看看如何设置示波器以在通道的上升沿触发。首先,触发模式必须设置为 EDGE,使用以下命令:
:TRIG:MODE EDGE
:TRIGger:EDGe:SOURce
命令识别应监控哪个通道的边沿,并可按以下方式使用:
:TRIG:EDG:SOUR CHAN2
:TRIGger:EDGe:SLOPe
识别边沿类型,可设置为 POSitive
、NEGative
或 RFALI
(上升/下降)。
Rigol 为表 6 中列出的每种模式提供了类似的模式特定命令。
8. 波形配置
PC-示波器接口的一个重要优势是能够下载示波器的测量数据。这由 :WAVeform
命令实现,该命令配置测量属性,例如格式和源。表 7 列出了与 :WAVeform
相关的限定符。
命令 | 参数 | 描述 | |
---|---|---|---|
:DATA? |
-- | 检索波形数据 | |
:SOURce | CHANnel1 , CHANnel2 ,CHANnel3 , CHANnel4 , MATH |
获取/设置波形显示的源 | |
:MODE | NORMal , MAXimum ,RAW |
获取/设置如何读取波形数据 | |
:FORMat |
BYTE , WORD , ASCii |
获取/设置波形数据的格式 | |
:XINCrement? |
-- | 获取相邻样本之间的时间差 | |
:XORIgin? |
-- | 获取从触发点到通道源参考时间的时间 | |
:XREFerence? |
-- | 获取指定通道源的参考时间 | |
:YINCrement? |
-- | 获取相邻样本之间的时间差(等于垂直刻度/25) | |
:YORIgin? |
-- | 获取从触发点到通道源参考时间的时间 | |
:YREFerence? |
-- | 获取指定通道源的参考位置 | |
:STARt |
见下文 | 获取/设置读取内部内存波形的起始位置 | |
:STOP |
见下文 | 获取/设置读取内部内存波形的停止位置 |
当示波器的测量完成后,:WAVeform:DATA?
命令会将样本数据传输到计算机。:WAVeform:SOURce
命令用于识别通道,:WAVeform:MODE
指定应读取哪些数据。此命令接受三个选项:
NORMal
- 读取屏幕上显示的数据MAXimum
- 读取示波器处于运行状态时的屏幕数据,停止状态下的内部内存数据RAW
- 从内部内存读取数据
我用过的每台 Rigol 示波器每样本存储八位。:WAVeform:FORMat
命令指定这八位如何格式化。此命令可接受以下三个值之一:
BYTE
- 每个样本都以 0 到 255 之间的 8 位值提供WORD
- 每个样本都以 16 位值提供,只有低 8 位有效ASCii
- 每个样本都以文本形式提供,使用浮点表示法(例如-1.96e-03
)
:WAVeform:START
和 :WAVeform:STOP
命令用于标识从示波器读取数据的起始和结束位置。这两个命令都接受一个整数参数,该参数取决于模式设置:
NORMal
模式 - 1-1200MAXimum
- 1 到显示器上有效点的数量RAW
- 1 到内存深度(可通过:ACQuire:MDEPth
获取)
9. 完整测试示例
此时,您应该对 VISA 函数和 Rigol 命令有了基本的了解。现在让我们来看一个同时利用这两者的测试应用程序。输入信号具有以下属性:
- 输入通道:通道 2
- 电压范围:-1.5V 到 1.5V
- 周期性,频率为 1 kHz
- 期望采样频率:尽可能高
有了这些信息,我们就可以编写一个读取信号并将测量数据传输到 PC 的应用程序。该应用程序不使用 :AUT
命令,而是配置测量的每个方面:
- 为了确保可以测量 -1.5V 到 1.5V 的范围,使用命令
:CHAN2:RANG 4
将垂直范围设置为 4V。 - 如果信号是周期性的,频率为 1 kHz,则每个周期等于 1/1000 或 1 ms。要看到五个周期,水平范围至少需要 5ms。如果有十二格,则水平刻度至少需要 5ms/12 = .4166 ms/div。为安全起见,将水平刻度设置为 1 ms/div,使用命令
:TIM:MAIN:SCAL 0.001
。 - 使用
:CHAN2:BWL 20M
命令设置 20 MHz 带宽限制以降低噪声。 :WAV:MODE RAW
命令指定要从内部内存读取发送到 PC 的测量数据。- 命令
:WAV:STAR 1
和:WAV:STAR 800000
指定只将前 800,000 个样本读回 PC。 - 使用
:SING
将触发器设置为单次触发。
以下代码使用 VISA 函数打开与示波器的会话。然后,它传递配置命令集,后跟 :RUN
和 :TFOR
。然后使用 :WAV:DATA?
命令将数据读取到计算机。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <visa.h> #include "Windows.h" #define NUM_CMDS 10 #define CMD_SIZE 64 static ViSession rmSession, scopeSession; static ViFindList resourceList; static ViUInt32 numResources; static ViStatus status; static char usbResource[VI_FIND_BUFLEN]; // Execute each command in a list void run_commands(char commands[NUM_CMDS][CMD_SIZE]) { int i; for(i=0; i<NUM_CMDS; i++) { status = viWrite(scopeSession, (ViBuf)commands[i], 512, VI_NULL); if(status != VI_SUCCESS) { printf("Error executing %s\n", commands[i]); exit(-1); } } } int main() { // The list of commands static char cmds[NUM_CMDS][CMD_SIZE] = {":CHAN2:RANG 4\n", ":CHAN2:BWL 20M\n", ":TIM:MAIN:SCAL 0.001\n", ":WAV:MODE RAW\n", "WAV:SOUR CHAN2\n", ":WAV:STAR 1\n", ":WAV:STOP 800000\n", ":SING\n", ":RUN\n", ":TFOR\n"}; // Open session with the resource manager viOpenDefaultRM(&rmSession); // Find USB resources viFindRsrc(rmSession, "USB?*INSTR", &resourceList, &numResources, usbResource); // Open session to the resource viOpen(rmSession, usbResource, VI_NULL, VI_NULL, &scopeSession); // Configure the device and start measurement run_commands(cmds); // Wait for the scope's measurement Sleep(1000); // Read the response viWrite(scopeSession, (ViBuf)":STOP\n", 512, VI_NULL); viWrite(scopeSession, (ViBuf)":WAV:DATA?\n", 512, VI_NULL); viReadToFile(scopeSession, "wave.dat", 800000, VI_NULL); // Close the session to the resource viClose(scopeSession); viClose(rmSession); return 0; }
在我的应用程序中,我注意到我无法一次性将所有 2,400,000 个样本传输到 PC。因此,我的应用程序执行三次单独的读取操作,每次读取 800,000 个样本。
使用代码
要编译本文中的示例应用程序,C 编译器需要知道 visa.h 的位置和一个合适的 VISA 库,例如 visa32.lib。第二个示例应用程序依赖于 Windows.h 的 Sleep
函数,但这可以很容易地更改为适用于其他操作系统。
关注点
作为一名电气工程师,学习如何在代码中接口示波器极大地提高了我的工作效率。此外,我还对现代示波器的各种功能和特性有了深入的了解。
历史
- 2015/2/6 - 修复了图像链接
- 2015/2/6 - 上传了包含两个源文件(id_check.c 和 full_test.c)的压缩文件