65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C 接口 Rigol 示波器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (9投票s)

2015年2月5日

CPOL

20分钟阅读

viewsIcon

31461

downloadIcon

541

本文介绍如何开发能够访问和控制 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 标准的示波器的过程包括五个步骤:

  1. 使用 viOpenDefaultRM 打开与资源管理器通信的会话 (ViSession)。
  2. 使用 viFindRsrc 访问资源 (ViRsrc)。
  3. 使用 viOpen 打开与资源通信的会话 (ViSession)。
  4. 使用 viWrite 向资源发送命令,并使用 viRead 将数据读回 PC。
  5. 使用 viClose 关闭会话。

为了说明这些函数如何被调用,表 1 列出了十个 VISA 函数的签名并提供了每个函数的描述。VISA 标准定义的函数不止这些,但这些是接口示波器所需的核心函数。

表 1:用于接口测试仪器的 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 展示了这些类别的大致样子。

Command categories

图 1:按语法划分的命令类别

IEEE-488 标准于 20 世纪 60 年代末创建,用于定义访问通过通用接口总线 (GPIB) 连接的测试仪器的命令。每个命令都以星号开头,前面的示例使用 *IDN? 来查询标识字符串。同样,*RST 会重置仪器,*TST 会执行自检。*OPC? 用于检查当前操作是否仍在继续,*WAI 用于等待操作完成。了解这些命令很有用,但我在测试应用程序中很少使用它们。

Rigol 在 IEEE-488 命令的基础上,添加了专门用于接口 Rigol 示波器的命令。关于这些命令有三点需要理解:

  1. 每个命令都以冒号开头,后面跟着大写字母。在本文中,如果一个命令被写成 :CLEar:TIMebase,只有大写字母是重要的。附加的字母是为了清晰起见而打印的。
  2. 以问号结尾的命令是查询命令。它从仪器中读取(获取)信息。
  3. 初始命令名称后面可以跟限定符,每个限定符都以冒号开头。例如::CHANnel2:SCALe:TIMebase:DELay:ENABle。带限定符的命令称为复杂命令,不带限定符的命令称为简单语句。没有简单的查询。

以下各节将更详细地介绍简单语句和复杂命令。

4. 简单语句

Rigol 的简单语句用于告诉示波器执行一个操作。表 2 列出了所有六个简单语句并提供了描述。

表 2:Rigol 示波器的简单语句
声明 描述
:RUN 告诉示波器等待触发并开始测量
:STOP  停止示波器的运行
:CLEar 清除屏幕上的波形
:SINGle 设置单次触发模式(见下文)
:TFORce 强制触发条件
:AUToscale  告诉示波器根据输入信号配置垂直刻度、水平刻度
(时基)和触发器

这些语句很容易理解。重要的是要看到 :RUN 并不一定意味着让示波器进行测量和记录数据。它告诉示波器等待触发条件,届时它将开始测量。测量完成后,示波器将等待下一次触发,除非将其置于单次触发模式 (:SINGle)。

触发条件可以通过多种方式配置,这将在后面的章节中解释。如果您希望示波器在不等待的情况下开始测量,:TFORce 会强制触发条件。

在我的测试应用程序中,发送到示波器的命令通常遵循一个五步序列:
  1. 配置示波器的运行(垂直/水平刻度、数据采集、触发器、波形)
  2. :RUN 告诉示波器等待触发
  3. (等待足够的时间使测量完成)
  4. :STOP 告诉示波器停止运行
  5. :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> 命令一起使用的限定符。对于每个限定符,表格列出了可能的参数和描述。

表 3:通道配置命令
限定符 参数 描述  
:UNITs VOLTage, WATT,
AMPere, UNKnown
获取/设置通道测量的单位  
:DISPLAY 0/OFF1/ON 获取/设置通道是否在示波器上显示  
:BWLimit 20MOFF 获取/设置是否启用 20 MHz 带宽限制  
:COUPling AC, DC, 或 GND

获取/设置是否阻止交流和直流分量 (GND),
阻止直流分量 (AC),
或不阻止任何分量 (DC)

 
:INVert 0/OFF1/ON 获取/设置显示模式是否反转  
:TCAL  -100100 获取/设置校准零偏置所需的时间  
: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/OFF1/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 设置为 1ON,则可以以更小的增量调整垂直刻度。

: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 列出了其限定符和可能的参数。

表 4:时基配置命令
限定符 参数 描述  
:MODE MAIN, XY, 或 ROLL 获取/设置输入信号的显示方式  
[:MAIN]:SCALe 主模式:5ns 到 50s
滚动模式:200ms 到 50s
获取/设置水平时间刻度(扫描速度)  
[:MAIN]:OFFSet -屏幕/2 到 1s 或
-屏幕/2 到 5000s
获取/设置水平偏移  
:DELay:ENABle 0/OFF1/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 列出了可用的命令。

表 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. 触发配置

当满足触发条件时,示波器开始读取信号数据。要在应用程序中设置触发条件,通常需要两个步骤:

  1. 使用适当的触发模式调用 :TRIGger:MODE 命令。
  2. 调用特定于所选模式的 :TRIGger 命令。

Rigol 示波器支持十五种触发模式,并且有大量的模式特定命令。因此,本文的讨论仅限于介绍这十五种模式,如表 6 所示。

表 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 识别边沿类型,可设置为 POSitiveNEGativeRFALI(上升/下降)。

 :TRIG:EDG:SLOP NEG

Rigol 为表 6 中列出的每种模式提供了类似的模式特定命令。

8. 波形配置

PC-示波器接口的一个重要优势是能够下载示波器的测量数据。这由 :WAVeform 命令实现,该命令配置测量属性,例如格式和源。表 7 列出了与 :WAVeform 相关的限定符。

表 7:触发模式
命令 参数 描述  
:DATA? -- 检索波形数据  
:SOURce CHANnel1, CHANnel2,
CHANnel3, CHANnel4, MATH
获取/设置波形显示的源  
:MODE NORMal, MAXimum,
RAW
获取/设置如何读取波形数据  
:FORMat BYTE, WORDASCii 获取/设置波形数据的格式
:XINCrement? -- 获取相邻样本之间的时间差
:XORIgin? -- 获取从触发点到通道源参考时间的时间
:XREFerence? -- 获取指定通道源的参考时间
:YINCrement? -- 获取相邻样本之间的时间差(等于垂直刻度/25)
:YORIgin? -- 获取从触发点到通道源参考时间的时间
:YREFerence? -- 获取指定通道源的参考位置
:STARt 见下文 获取/设置读取内部内存波形的起始位置
:STOP 见下文 获取/设置读取内部内存波形的停止位置

当示波器的测量完成后,:WAVeform:DATA? 命令会将样本数据传输到计算机。:WAVeform:SOURce 命令用于识别通道,:WAVeform:MODE 指定应读取哪些数据。此命令接受三个选项:

  1. NORMal - 读取屏幕上显示的数据
  2. MAXimum - 读取示波器处于运行状态时的屏幕数据,停止状态下的内部内存数据
  3. RAW - 从内部内存读取数据

我用过的每台 Rigol 示波器每样本存储八位。:WAVeform:FORMat 命令指定这八位如何格式化。此命令可接受以下三个值之一:

  1. BYTE - 每个样本都以 0 到 255 之间的 8 位值提供
  2. WORD - 每个样本都以 16 位值提供,只有低 8 位有效
  3. ASCii - 每个样本都以文本形式提供,使用浮点表示法(例如 -1.96e-03

:WAVeform:START:WAVeform:STOP 命令用于标识从示波器读取数据的起始和结束位置。这两个命令都接受一个整数参数,该参数取决于模式设置:

  • NORMal 模式 - 1-1200
  • MAXimum - 1 到显示器上有效点的数量
  • RAW - 1 到内存深度(可通过 :ACQuire:MDEPth 获取)

9. 完整测试示例

此时,您应该对 VISA 函数和 Rigol 命令有了基本的了解。现在让我们来看一个同时利用这两者的测试应用程序。输入信号具有以下属性:

  • 输入通道:通道 2
  • 电压范围:-1.5V 到 1.5V
  • 周期性,频率为 1 kHz
  • 期望采样频率:尽可能高

有了这些信息,我们就可以编写一个读取信号并将测量数据传输到 PC 的应用程序。该应用程序不使用 :AUT 命令,而是配置测量的每个方面:

  1. 为了确保可以测量 -1.5V 到 1.5V 的范围,使用命令 :CHAN2:RANG 4 将垂直范围设置为 4V。
  2. 如果信号是周期性的,频率为 1 kHz,则每个周期等于 1/1000 或 1 ms。要看到五个周期,水平范围至少需要 5ms。如果有十二格,则水平刻度至少需要 5ms/12 = .4166 ms/div。为安全起见,将水平刻度设置为 1 ms/div,使用命令 :TIM:MAIN:SCAL 0.001
  3. 使用 :CHAN2:BWL 20M 命令设置 20 MHz 带宽限制以降低噪声。
  4. :WAV:MODE RAW 命令指定要从内部内存读取发送到 PC 的测量数据。
  5. 命令 :WAV:STAR 1:WAV:STAR 800000 指定只将前 800,000 个样本读回 PC。
  6. 使用 :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)的压缩文件
© . All rights reserved.