Remote-control a Siglent SDS1000X-E series oscilloscope (SDS1104X-E, SDS1204X-E, etc.) over the network — SCPI command essentials, screenshots, deep-memory waveform transfer, and the firmware quirks that hang naive clients. Use when the user wants to talk to, automate, screenshot, or pull waveform data from a Siglent SDS1000X-E-series scope.
Scanned 9/10/2026
Install to Claude Code
npx -y skills add curtisgalloway/public-skills --skill siglent-scope --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Siglent Scope?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/curtisgalloway-siglent-scope)More formats (shields.io, HTML) on the badges page.
---
name: siglent-scope
description: Remote-control a Siglent SDS1000X-E series oscilloscope (SDS1104X-E, SDS1204X-E, etc.) over the network — SCPI command essentials, screenshots, deep-memory waveform transfer, and the firmware quirks that hang naive clients. Use when the user wants to talk to, automate, screenshot, or pull waveform data from a Siglent SDS1000X-E-series scope.
---
<!--
SPDX-FileCopyrightText: 2026 contributors
SPDX-License-Identifier: Apache-2.0
-->
# siglent-scope
Remote control and data transfer for Siglent SDS1000X-E series scopes
(verified on an SDS1104X-E, firmware 6.1.37R17). No VISA stack needed —
everything below works over a plain TCP socket.
## Finding and reaching the scope
Resolve the address in this order:
1. An explicit address from the user, a local companion skill, or
project docs.
2. `$SCOPE_HOST` env var.
3. The bare hostname **`scope`** — the default convention; it resolves
via the local DNS search domain when the scope has a DNS entry.
Verify with the sanity check below before assuming.
4. Otherwise ask the user. The scope shows its IP under
Utility → I/O → LAN.
Endpoints (ports are fixed):
- **:5025** — raw SCPI socket (preferred; one client at a time)
- :5024 — telnet SCPI
- VXI-11 (works with pyvisa `TCPIP::<host>::INSTR`)
- :80 — embedded web UI / virtual front panel (4-channel models)
Sanity check:
```bash
printf '*IDN?\n' | nc -w 3 <scope-host> 5025
```
## SCPI essentials (LeCroy-derived dialect)
- Send `CHDR OFF` first — strips echoed headers from query replies.
Persists on the instrument across connections.
- Common queries: `*IDN?`, `TDIV?`, `SARA?` (sample rate), `C1:VDIV?`,
`C1:OFST?`, `SANU? C1` (acquired points), `TRMD?`, `MSIZ?`. Settings are
the same commands with a value (`TDIV 1MS`, `C1:TRLV 1.5V`, `MSIZ 14M`).
- **Screenshot**: `SCDP` returns a raw 800×480 BMP — no length prefix;
parse the file size from BMP header bytes 2–5 (little-endian), then one
trailing `\n`.
- **Waveform**: `WFSU SP,0,NP,0,FP,0` (all points) then `C1:WF? DAT2`.
The reply embeds `#9<nine ASCII digits = byte count><int8 payload>`
followed by exactly two `\n` bytes.
Volts = code × (VDIV/25) − OFST; time axis from `SARA?`.
## Firmware quirks (observed on 6.1.37R17 — these WILL hang naive clients)
- **`SAST?` never replies while trigger mode is STOP** — the connection
hangs forever, no error. Poll `INR?` bit 0 instead (latched
acquisition-done flag, clears on read; read once before arming to
discard stale state).
- **`ARM` force-starts a sweep immediately** — it does NOT merely arm.
`TRMD SINGLE` alone is how you arm and wait for a real trigger.
- **`FRTR` (force trigger) is a no-op while armed in SINGLE mode.** To
force a stuck single acquisition, send `ARM`.
- **Any `MSIZ` write clamps `TDIV` to 1 ns/div** — even rewriting the
value MSIZ already has — and the clamp can land asynchronously AFTER a
subsequent `TDIV` write. Round-trip any query after `MSIZ`, then set
`TDIV` and verify the read-back in a retry loop until it sticks.
## Hardware facts (X-E series)
- Channels share ADCs in pairs (CH1/CH2 and CH3/CH4 on 4-ch models).
Full sample rate (1 GSa/s) and full memory (14 Mpts) per channel only
when ≤1 channel of each pair is active — for two-channel work use
**C1 + C3**.
- 14 Mpts @ 1 GSa/s = 14 ms record; a 14 Mpts × 2-channel pull over the
:5025 socket takes ~4.5 s (~6.4 MB/s), delivered as a single `WF?`
block — no chunking required.
- 100/200 MHz analog bandwidth: fine for USB low/full-speed signal
integrity work; not usable for USB high speed (480 Mb/s).
## Reference
[SDS1000X-E Programming Guide](https://www.batterfly.com/PDF/Siglent/SDS1000X-E/SDS1000X-E_programmingguide_EN.pdf)
— full command set. Where this skill's quirks list conflicts with the
guide, trust the quirks list; it was verified on the wire.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!