{"id":32663,"date":"2026-10-19T12:32:22","date_gmt":"2026-10-19T19:32:22","guid":{"rendered":"https:\/\/digilent.com\/blog\/?p=32663"},"modified":"2026-10-19T12:32:22","modified_gmt":"2026-10-19T19:32:22","slug":"using-the-waveforms-sdk-with-python","status":"publish","type":"post","link":"https:\/\/digilent.com\/blog\/using-the-waveforms-sdk-with-python\/","title":{"rendered":"WaveForms SDK With Python: When, Why, and Where to Start"},"content":{"rendered":"<p><span style=\"font-size: 1rem;\">Running the same measurement 500 times, logging data overnight, or feeding captured samples directly into a Python analysis pipeline is where the <\/span><a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/shop\/waveforms\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" style=\"background-color: white; font-size: 1rem;\" tabindex=\"-1\">WaveForms<\/a><span style=\"font-size: 1rem;\"> graphical application may start to fall short.<\/span><\/p>\n<div>\n<p>The WaveForms SDK gives you programmatic control of Digilent test and measurement devices from your own scripts. It is a C-callable API that Python can access through <code>ctypes<\/code>, making it useful for automation, data logging, and integration with other tools. You get access to the same instruments without needing someone to operate them manually.<\/p>\n<p>If you already know that you want ready-to-run code, head directly to the <a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/reference\/test-and-measurement\/guides\/waveforms-sdk-getting-started\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">Getting Started With WaveForms SDK<\/a> reference guide. It covers installation, device connection, oscilloscope capture, waveform generation, DMM readings, logic analysis, and UART, SPI, and I2C protocol control.<\/p>\n<p>Still deciding whether the SDK fits your project? Keep reading.<\/p>\n<h2>What Is the WaveForms SDK, and What Isn\u2019t It?<\/h2>\n<p>The WaveForms SDK is the public, C-callable API for Digilent test and measurement devices. It is included with the WaveForms installer. Python programs access it through <code>ctypes<\/code>, which loads the DWF dynamic library and calls its functions directly.<\/p>\n<p>It is not a separate product, a REST service, or a casual replacement for the graphical interface. It is a programming interface.<\/p>\n<p>Think of the WaveForms application and the SDK as two doors into the same hardware. The application provides graphical instrument panels, while the SDK makes those instruments available as callable functions. Both communicate with the device through the DWF library, so settings that can be adjusted with controls in the GUI can also be configured with function calls in your code.<\/p>\n<p>The primary difference is control. The SDK allows you to script, loop, schedule, and integrate measurements in ways the GUI cannot. That flexibility also means you are responsible for writing and maintaining the program logic instead of clicking through the application.<\/p>\n<h2>Supported Devices at a Glance<\/h2>\n<p>The WaveForms SDK supports a wide range of Digilent test and measurement devices, including:<\/p>\n<ul>\n<li>Analog Discovery 2 (previous-generation product)<\/li>\n<li><a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/shop\/analog-discovery-3\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">Analog Discovery 3<\/a> (AD3)<\/li>\n<li><a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/shop\/products\/mixed-signal-oscilloscopes\/discovery-essentials\/analog-discovery-studio\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">Analog Discovery Studio Max<\/a> (ADS Max)<\/li>\n<li>Analog Discovery Studio (legacy product)<\/li>\n<li><a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/shop\/digital-discovery-portable-usb-logic-analyzer-and-digital-pattern-generator\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">Digital Discovery<\/a><\/li>\n<li><a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/shop\/adp2230\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">ADP2230<\/a><\/li>\n<li><a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/shop\/adp2440\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">ADP2440<\/a><\/li>\n<li><a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/shop\/adp2450\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">ADP2450<\/a><\/li>\n<li><a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/shop\/adp-3000-series\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">ADP 3000 Series<\/a>, including ADP3450<\/li>\n<li><a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/shop\/adp-5000-series\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">ADP 5000 Series<\/a>, including ADP5250<\/li>\n<li>Electronics Explorer (legacy\/retired product)<\/li>\n<\/ul>\n<div><strong>Looking for current Python examples?<\/strong><span> Start with the SDK samples installed with the latest version of WaveForms. You can access the samples from the <\/span>WaveForms Welcome tab by selecting <em>\u201cWaveForms SDK,\u201d<\/em><span> or find them in the SDK samples directory on your computer. For setup instructions and examples covering device connection, oscilloscope capture, waveform generation, DMM readings, logic analysis, and protocol control, see the <\/span><a href=\"https:\/\/loop.usercontent.microsoft\/?disableExtension=true&amp;preview=true#\" target=\"_blank\" rel=\"noopener noreferrer\">Getting Started With WaveForms SDK<\/a><span> guide.<\/span><\/div>\n<h2>Supported Programming Languages<\/h2>\n<p>The WaveForms SDK is not limited to Python. It supports:<\/p>\n<ul>\n<li>C<\/li>\n<li>C++<\/li>\n<li>C#<\/li>\n<li>Python<\/li>\n<li>Visual Basic<\/li>\n<\/ul>\n<p>Python is a popular choice for scripting because it integrates with tools such as NumPy, SciPy, pandas, and Matplotlib.<\/p>\n<h2>When Is the WaveForms SDK the Right Choice?<\/h2>\n<p>When does using the SDK make sense? Reach for it when the WaveForms GUI cannot support the scale, repetition, or integration your project requires. The most common reasons to use it are automation, headless operation, and integration with a larger software pipeline.<\/p>\n<p>If your work is interactive and involves one-off measurements, the GUI is usually the better tool.<\/p>\n<h3>For Automated Testing<\/h3>\n<p>The SDK can run a fixed measurement sequence hundreds or thousands of times, branch based on the result, and automatically record every pass or failure.<\/p>\n<p>This type of repeatable, scripted control is useful for:<\/p>\n<ul>\n<li>Production-line testing<\/li>\n<li>Incoming quality control<\/li>\n<li>Parameter sweeps across a device under test (DUT)<\/li>\n<li>Repeated validation procedures<\/li>\n<li>Unattended overnight captures<\/li>\n<\/ul>\n<p>The WaveForms GUI includes its own scripting environment, but those scripts operate within an active WaveForms session. The SDK is a better fit when you need a standalone program or a workflow that runs without someone operating the graphical application.<\/p>\n<h3>For Headless or Remote Operation<\/h3>\n<p>A Digilent device operating in a remote laboratory, on a continuous integration system, or inside a manufacturing computer may not have a monitor attached.<\/p>\n<p>The SDK does not require the WaveForms graphical interface to remain open. It can run from the command line, making it useful when the instrument is accessed remotely or through SSH.<\/p>\n<h3>When You Need to Integrate With a Larger Pipeline<\/h3>\n<p>Use the SDK when measurement data needs to flow directly into other tools.<\/p>\n<p>For example, you might send captured samples to:<\/p>\n<ul>\n<li>NumPy for an FFT or other numerical analysis<\/li>\n<li>pandas for statistical analysis and data organization<\/li>\n<li>Matplotlib for custom plots<\/li>\n<li>PyTorch for machine-learning classification<\/li>\n<li>A database or custom logging system<\/li>\n<li>A larger automated test framework<\/li>\n<\/ul>\n<p>Where the GUI may end with exporting a CSV file, the SDK can place captured data directly into the Python data structures your code already uses.<\/p>\n<h3>When the WaveForms GUI Is the Better Choice<\/h3>\n<p>The SDK is not a complete replacement for the WaveForms graphical application. The two tools complement each other.<\/p>\n<p>The GUI is usually the better choice for:<\/p>\n<ul>\n<li>One-time measurements<\/li>\n<li>Teaching demonstrations<\/li>\n<li>Quick sanity checks<\/li>\n<li>Interactive troubleshooting<\/li>\n<li>Workflows that require a live view of the signal<\/li>\n<li>Experimenting with instrument settings<\/li>\n<\/ul>\n<p>When you want to see a waveform update in real time and adjust a few controls, the GUI is usually faster. The SDK pays off when repetition, scale, unattended operation, or data integration enters the picture.<\/p>\n<h2>What Do You Need to Get Started?<\/h2>\n<p>Getting started requires three things:<\/p>\n<ol>\n<li>A supported Digilent test and measurement device<\/li>\n<li>The free WaveForms software, which includes the SDK<\/li>\n<li>A working knowledge of Python<\/li>\n<\/ol>\n<p>You do not need to download the SDK separately.<\/p>\n<h3>Hardware<\/h3>\n<p>Supported options include Analog Discovery 2, Analog Discovery 3, Digital Discovery, Analog Discovery Studio, and ADP-series devices.<\/p>\n<p>Analog Discovery 3 is a current-generation option supported by the vendor examples included with WaveForms.<\/p>\n<p>Devices use the same general API structure, allowing many SDK examples to work across multiple products. However, available instruments, channels, sample rates, and other capabilities will depend on the connected hardware.<\/p>\n<p>If you are purchasing new hardware specifically to explore the SDK, Analog Discovery 3 is a practical starting point for working with current examples and features.<\/p>\n<h3>Software<\/h3>\n<p>Install the WaveForms application. For installation instructions, follow the <a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/reference\/test-and-measurement\/guides\/waveforms-sdk-getting-started\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">Getting Started With WaveForms SDK<\/a> guide.<\/p>\n<p>Python 3.x is the primary additional requirement. The <code>ctypes<\/code> module used to access the DWF library is included with Python.<\/p>\n<p>On Linux, make sure you install the WaveForms package and device-support components appropriate for your distribution and system architecture.<\/p>\n<h3>Skills You\u2019ll Want<\/h3>\n<p>Basic Python skills, including variables, functions, loops, and imports, will cover many common SDK workflows.<\/p>\n<p>It is also helpful to understand C-style function signatures because the DWF API is accessed through <code>ctypes<\/code>, and its calls resemble C functions. For example:<\/p>\n<p><code>FDwfAnalogInStatus()<\/code><\/p>\n<p>Familiarity with the WaveForms GUI is useful because the SDK exposes many of the instruments and configuration options found in the graphical panels.<\/p>\n<p>If you have previously automated instruments with LabVIEW, MATLAB, PyVISA, or a similar environment, many of the basic workflow concepts will feel familiar.<\/p>\n<h2>How Does the WaveForms SDK Workflow Feel in Practice?<\/h2>\n<p>Most WaveForms SDK programs follow a familiar pattern. The details change depending on the instrument and measurement, but the overall workflow remains largely the same.<\/p>\n<h3>The Enumerate, Open, Configure, Run, Read, and Close Pattern<\/h3>\n<p>A typical SDK program follows these steps:<\/p>\n<ol>\n<li><strong>Enumerate:<\/strong> List connected devices with a call such as <code>FDwfEnum()<\/code>.<\/li>\n<li><strong>Open:<\/strong> Acquire a handle, called <code>hdwf<\/code>, to one device.<\/li>\n<li><strong>Configure:<\/strong> Select the instrument and configure settings such as sample rate, buffer size, channel range, or trigger conditions.<\/li>\n<li><strong>Run:<\/strong> Start the acquisition or signal generation.<\/li>\n<li><strong>Read:<\/strong> Pull captured samples or measurement results into memory.<\/li>\n<li><strong>Close:<\/strong> Release the handle so that another process can access the device.<\/li>\n<\/ol>\n<p>This general pattern applies whether you are capturing a waveform, generating a sine wave, reading a DMM value, or working with digital signals.<\/p>\n<p>The <a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/reference\/test-and-measurement\/guides\/waveforms-sdk-getting-started\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">WaveForms SDK reference guide<\/a> provides runnable examples that demonstrate the different stages of this process.<\/p>\n<h2>How the SDK Differs From CLI and REST Interfaces<\/h2>\n<p>The WaveForms SDK is a library, not a standalone service.<\/p>\n<p>Your Python process loads the DWF library and calls functions such as <code>FDwfAnalogInStatus()<\/code> directly. This provides low-level access to the connected device without requiring a separate REST service or remote API.<\/p>\n<p>A device handle also gives your program direct control of that device. If you need several programs or remote users to share the same instrument, you will need to build an additional application or service layer on top of the SDK.<\/p>\n<h2>Common Use Cases That Make the SDK Worth Learning<\/h2>\n<p>The SDK is particularly useful when repetition, duration, or integration with other software matters.<\/p>\n<h3>Automated Production Test Benches<\/h3>\n<p>A production-test script might read a serial number from a barcode scanner, run a fixed measurement sequence, compare the results against defined limits, and record a pass-or-fail result.<\/p>\n<p>By following the enumerate, open, configure, run, read, and close pattern, the same program can evaluate multiple devices using a repeatable procedure.<\/p>\n<p>This transforms a manual bench check into an automated and documented workflow.<\/p>\n<h3>Long-Duration or Scheduled Data Logging<\/h3>\n<p>Monitoring overnight temperature drift or tracking power-supply behavior over a long period is not something you want to watch manually.<\/p>\n<p>With the SDK, you can capture data and write it to disk at defined intervals. The script can continue running for as long as the measurement requires, subject to the hardware, operating system, storage, and program configuration.<\/p>\n<h3>Custom Analysis Pipelines With NumPy, pandas, and Matplotlib<\/h3>\n<p>You can use the SDK to capture samples and then:<\/p>\n<ul>\n<li>Run an FFT or other numerical analysis in NumPy<\/li>\n<li>Organize and summarize results with pandas<\/li>\n<li>Create custom plots with Matplotlib<\/li>\n<li>Export results as CSV, Parquet, or another supported format<\/li>\n<\/ul>\n<p>This is where the SDK begins to repay its learning curve. Instead of working only with the GUI\u2019s built-in tools, you can use measurement data throughout the Python ecosystem.<\/p>\n<h3>Integration Into Laboratory or Manufacturing Workflows<\/h3>\n<p>Developers can wrap SDK calls inside a Python class or application and connect them to other laboratory or manufacturing systems.<\/p>\n<p>For example, a custom application could trigger a measurement, process the result, store it in a database, and make it available to another internal system. Developers who need network access can also build a REST, gRPC, or other service layer around the SDK.<\/p>\n<h3>Embedded Control on Raspberry Pi and Edge Devices<\/h3>\n<p>For supported operating systems and processor architectures, pairing a compact computer such as a Raspberry Pi with a Digilent device can support portable, remote, or lower-power instrumentation.<\/p>\n<p>This can be useful for:<\/p>\n<ul>\n<li>Remote monitoring<\/li>\n<li>Portable test systems<\/li>\n<li>Compact laboratory stations<\/li>\n<li>Edge-based data collection<\/li>\n<li>Automated educational setups<\/li>\n<\/ul>\n<p>Before selecting a Raspberry Pi or another ARM-based system, confirm that the available WaveForms package supports the board\u2019s operating system and architecture.<\/p>\n<h2>Third-Party Python Wrappers: pydwf and dwfpy<\/h2>\n<p>Third-party Python packages can make the SDK easier to use for developers who prefer a more Pythonic interface.<\/p>\n<p>Two wrappers you may encounter are <code>pydwf<\/code> and <code>dwfpy<\/code>. Both communicate with the same underlying DWF library, but they organize SDK access differently.<\/p>\n<p>Because these are community-maintained projects rather than the core vendor API, check their current documentation, maintenance status, hardware support, and release history before selecting one for a new project.<\/p>\n<h3>When to Use pydwf<\/h3>\n<p>You may encounter <code>pydwf<\/code> in existing projects that require broad access to the DWF API.<\/p>\n<p>It may still be relevant when maintaining an established codebase. However, evaluate its current project status and compatibility before choosing it for new development.<\/p>\n<h3>When to Use dwfpy<\/h3>\n<p><code>dwfpy<\/code> provides a higher-level, more Pythonic interface for common workflows such as oscilloscope capture, arbitrary waveform generation, and DMM readings.<\/p>\n<p>A higher-level wrapper may require less setup code, although it may not expose every advanced capability available through the underlying DWF API.<\/p>\n<h3>When Should You Skip Both and Use Raw ctypes?<\/h3>\n<p>Use raw <code>ctypes<\/code> when following Digilent\u2019s vendor examples or when you need direct access to the C API.<\/p>\n<p>This approach keeps your code close to the official function names and reference documentation. When something goes wrong, each function in your program maps directly to an entry in the WaveForms SDK Reference Manual.<\/p>\n<p>Using raw <code>ctypes<\/code> may require more setup code, but it reduces your dependence on a third-party abstraction.<\/p>\n<h2>Where to Find Working Code Examples<\/h2>\n<p>You can find WaveForms SDK examples in Digilent\u2019s documentation, in the files installed with WaveForms, and through community support resources.<\/p>\n<h3>The Official Getting Started With WaveForms SDK Guide<\/h3>\n<p>Digilent\u2019s <a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/reference\/test-and-measurement\/guides\/waveforms-sdk-getting-started\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">Getting Started With WaveForms SDK<\/a> guide is the primary starting point.<\/p>\n<p>It covers:<\/p>\n<ul>\n<li>Installing the required software<\/li>\n<li>Connecting to a device<\/li>\n<li>Capturing oscilloscope data<\/li>\n<li>Generating waveforms<\/li>\n<li>Taking DMM readings<\/li>\n<li>Performing logic analysis<\/li>\n<li>Generating digital patterns<\/li>\n<li>Controlling static I\/O<\/li>\n<li>Working with UART, SPI, and I2C protocols<\/li>\n<\/ul>\n<p>The examples focus on Python and demonstrate the structure of common SDK workflows.<\/p>\n<h3>The Vendor Examples Included With WaveForms<\/h3>\n<p>Once WaveForms is installed, its SDK samples folder contains example programs for supported programming languages.<\/p>\n<p>The standard locations include:<\/p>\n<ul>\n<li><strong>Windows 64-bit:<\/strong> <code>C:\\Program Files (x86)\\Digilent\\WaveFormsSDK\\samples<\/code><\/li>\n<li><strong>Linux:<\/strong> <code>\/usr\/share\/digilent\/waveforms\/samples\/<\/code><\/li>\n<li><strong>macOS:<\/strong> <code>\/Applications\/WaveForms.app\/Contents\/Resources\/SDK\/samples\/<\/code><\/li>\n<\/ul>\n<p>These examples are useful when you need a starting point for a particular instrument or function.<\/p>\n<h3>The Digilent Test and Measurement Forum<\/h3>\n<p>For specific questions, visit the Test and Measurement section of the<a href=\"https:\/\/forum.digilent.com\/\"> Digilent Forum<\/a>.<\/p>\n<p>Existing discussions may already cover the device, function, operating system, error message, or SDK workflow you are troubleshooting.<\/p>\n<h3>The WaveForms SDK Reference Manual<\/h3>\n<p>For the full function list and parameter documentation, consult the <a class=\"fui-Link fai-bebop ___1myvvpj f2hkw1w f3rmtva f1ewtqcl f16muhyy f1k6fduh f1w7gpdv f1mo0ibp fjoy568 ff5ikls f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f33ey8m f9n3di6 f1ids18y f1tx3yz7 f1bwia3u f1eh06m1 f1xeumsx fhgqx19 f1olyrje f1p93eir f1nev41a f132whgj f1v74mp6 f1tsf1ni fnq52rx f16zlvvm\" href=\"https:\/\/digilent.com\/reference\/software\/waveforms\/waveforms-sdk\/reference-manual\" target=\"_blank\" rel=\"noopener noreferrer\" data-tabster=\"{&quot;restorer&quot;:{&quot;type&quot;:1}}\" tabindex=\"-1\">WaveForms SDK Reference Manual<\/a>.<\/p>\n<p>The manual documents the <code>FDwf*<\/code> functions, their parameters, return values, and other implementation details.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<h3>Is the WaveForms SDK Free?<\/h3>\n<p>Yes. The SDK is included with the free WaveForms software, so there is no separate SDK purchase.<\/p>\n<p>A supported Digilent test and measurement device is still required to interact with the hardware.<\/p>\n<h3>Does the WaveForms SDK Work With Analog Discovery 3?<\/h3>\n<div>Yes. Use the latest version of WaveForms and start with the SDK examples included with the software. These examples support current Digilent hardware and are the best starting point for exploring Analog Discovery 3 features. You can also consult the WaveForms SDK Reference Manual for the complete function list and API documentation.<\/div>\n<h3>Can I Run WaveForms SDK Scripts on a Raspberry Pi?<\/h3>\n<p>WaveForms and the SDK are available for certain ARM-based operating systems and architectures.<\/p>\n<p>Before beginning a Raspberry Pi project, check the available WaveForms packages against the exact Raspberry Pi model, processor architecture, and operating system you plan to use.<\/p>\n<p>After installing a compatible package, you can connect a supported Digilent device and run SDK scripts without relying on the desktop GUI.<\/p>\n<h3>How Do I Handle a Lost USB Connection During a Long Capture?<\/h3>\n<p>Design unattended scripts to check function return values and handle connection errors.<\/p>\n<p>If the USB connection is lost, the program may need to:<\/p>\n<ol>\n<li>Stop the current acquisition.<\/li>\n<li>Close the existing device handle.<\/li>\n<li>Detect the device again.<\/li>\n<li>Reopen the connection.<\/li>\n<li>Restore the required configuration.<\/li>\n<li>Resume the measurement when appropriate.<\/li>\n<\/ol>\n<p>For long acquisitions, write data to disk in smaller chunks. This can help limit data loss if a connection problem interrupts the session.<\/p>\n<h3>How Is the WaveForms SDK Different From the WaveForms Scripting Environment?<\/h3>\n<p>The scripting environment inside the WaveForms GUI uses JavaScript and operates as part of an active WaveForms session.<\/p>\n<p>The SDK supports standalone programs written in languages such as Python, C, C++, C#, and Visual Basic. It is generally the better option for unattended automation, headless operation, external data analysis, and integration with larger software systems.<\/p>\n<h3>Can I Control Multiple Analog Discovery Devices From One Python Script?<\/h3>\n<p>The SDK can enumerate connected devices with functions such as <code>FDwfEnum()<\/code>.<\/p>\n<p>A program can then open devices individually and maintain a separate handle for each connection. This can be useful for multi-device test systems, multi-DUT benches, and measurements that require more channels than a single device provides.<\/p>\n<p>The application should close each handle properly after completing the measurements.<\/p>\n<\/div>\n<div class='watch-action'><div class='watch-position align-left'><div class='action-like'><a class='lbg-style6 like-32663 jlk' data-task='like' data-post_id='32663' data-nonce='999022c356' rel='nofollow'><img src='https:\/\/digilent.com\/blog\/wp-content\/plugins\/wti-like-post-pro\/images\/pixel.gif' title='Like' \/><span class='lc-32663 lc'>0<\/span><\/a><\/div><div class='action-unlike'><a class='unlbg-style6 unlike-32663 jlk' data-task='unlike' data-post_id='32663' data-nonce='999022c356' rel='nofollow'><img src='https:\/\/digilent.com\/blog\/wp-content\/plugins\/wti-like-post-pro\/images\/pixel.gif' title='Unlike' \/><span class='unlc-32663 unlc'>0<\/span><\/a><\/div><\/div> <div class='status-32663 status align-left'>Be the 1st to vote.<\/div><\/div><div class='wti-clear'><\/div>","protected":false},"excerpt":{"rendered":"<p>Running the same measurement 500 times, logging data overnight, or feeding captured samples directly into a Python analysis pipeline is where the WaveForms graphical application may start to fall short. &hellip; <\/p>\n","protected":false},"author":47,"featured_media":32675,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[4325,4323,1563],"tags":[4433,5652,5657,5655,5650,5658,5302,5651,5656,5654,5653,5649,4422,5648,5659],"ppma_author":[4587],"class_list":["post-32663","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-debug-validation-test","category-software","category-guide","tag-analog-discovery-3","tag-automated-test-and-measurement","tag-ctypes-python","tag-data-acquisition-with-python","tag-digilent-python-api","tag-digilent-test-and-measurement","tag-digilent-waveforms","tag-dwf-api","tag-hardware-testing-with-python","tag-measurement-automation","tag-python-oscilloscope","tag-python-test-automation","tag-waveforms-sdk","tag-waveforms-sdk-python","tag-waveforms-sdk-tutorial"],"jetpack_featured_media_url":"https:\/\/digilent.com\/blog\/wp-content\/uploads\/2026\/10\/SeptemberSocials-WaveFormsPython-735x400-1.png","jetpack_sharing_enabled":true,"authors":[{"term_id":4587,"user_id":0,"is_guest":1,"slug":"digilent","display_name":"Digilent","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","author_category":"","user_url":"","last_name":"","last_name_2":"","first_name":"","first_name_2":"","job_title":"","description":""}],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/posts\/32663","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/users\/47"}],"replies":[{"embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/comments?post=32663"}],"version-history":[{"count":3,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/posts\/32663\/revisions"}],"predecessor-version":[{"id":32676,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/posts\/32663\/revisions\/32676"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/media\/32675"}],"wp:attachment":[{"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/media?parent=32663"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/categories?post=32663"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/tags?post=32663"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/digilent.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=32663"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}