doc/help/CSV-Export-Playback.md
Serial Studio can export incoming telemetry to CSV during a live session and replay saved CSV files through the same data pipeline. This page covers both workflows and the file format. For high-rate binary logging with per-channel sample rates and channel metadata, see MDF4 Export & Playback. Serial Studio Pro supports both formats and you can run them side by side.
The diagrams below show how CSV export runs on a background thread during live data, and how CSV playback feeds recorded data back through the same pipeline.
flowchart LR
A["Device"] --> B["Frame Builder"]
B --> C["Dashboard"]
B --> D["CSV File"]
Export runs in the background, writes in batches, and never blocks the dashboard.
flowchart LR
A["CSV File"] --> B["CSV Player"]
B --> C["Frame Builder"]
C --> D["Dashboard"]
CSV export is toggled in the Setup panel of the main window, under Data Export. Turn on the CSV Spreadsheet switch before or during a live connection. Once it's on, Serial Studio writes every incoming frame to a CSV file on a background thread, so dashboard performance isn't affected.
Exported CSV files land under your workspace folder (Documents/Serial Studio by default; configurable in Settings) in a structured hierarchy:
<Workspace>/CSV/<Project Name>/<YYYY-MM-DD_HH-MM-SS>.csv
For example, a session started at 3:30:05 PM on March 17, 2026, for a project named "Weather Station" would produce:
Documents/Serial Studio/CSV/Weather Station/2026-03-17_15-30-05.csv
Export and playback can be driven without the GUI. The API exposes csvExport.getStatus, csvExport.setEnabled, and csvExport.close for export, plus the csvPlayer.* family (open, setPaused, setProgress, getStatus, and frame stepping via csvPlayer.step) for playback. The --csv-export flag in the Command-Line Interface turns export on at startup.
The CSV file contains a header row followed by one row per received frame.
Header row:
Elapsed (s),GroupName/DatasetName,GroupName/DatasetName,...
The first column, labeled Elapsed (s), is elapsed time in seconds since the session started, with nanosecond precision (for example 0.000000000, 0.016384512). The remaining columns correspond to each dataset defined in the project, ordered by unique ID. Header labels are formed as GroupName/DatasetName (prefixed with SourceName/ when a project has multiple data sources) so you can trace each column back to the project structure.
Data rows. Each row is one complete frame. Cells hold the numeric or string values of each dataset at that point in time.
CSV export runs in the background and flushes to disk in batches. So even on slow storage (spinning disks, network shares, SD cards), CSV export never stalls the dashboard, drops frames, or pauses the pipeline.
To replay a recorded CSV file:
When a CSV file opens, Serial Studio looks at the first column to figure out the timestamp format:
0.0, 1.5, 3.016): used directly as elapsed time. This is the format Serial Studio's own export produces.2026/03/17 15:30:05): parsed into absolute timestamps and converted to elapsed offsets.The CSV Player has these controls:
| Control | Action | Shortcut |
|---|---|---|
| Play / Pause | Start or pause playback | Space |
| Previous frame | Step back one frame | Left Arrow |
| Next frame | Step forward one frame | Right Arrow |
| Progress slider | Seek to any position in the file | Drag or click |
The current timestamp shows next to the slider as HH:MM:SS.mmm.
During playback, the CSV Player feeds each row through the same data pipeline as a live connection: Frame Builder, then Dashboard. That means all widgets, plots, and gauges render exactly as they would with a live device. The player respects the original timing between frames, so playback speed matches the original recording rate.
For projects with multiple data sources, the CSV Player maps columns back to their respective source IDs. Each column is associated with a source based on the dataset's unique ID recorded in the header. The player reconstructs per-source frames and injects them into the pipeline at the right routing.
Playback runs at real-time speed by default. The player uses the timestamp differences between consecutive rows to schedule frame delivery, so the original data rate is preserved.
CSV opens in every common analysis tool:
import pandas; df = pandas.read_csv('file.csv').data = readtable('file.csv');.data <- read.csv('file.csv').For per-channel sample rates, channel-level units and metadata, or smaller files at high data rates, use MDF4 instead — see MDF4 Export & Playback.