SerialPulse Studio v1.0
ESP32 Preset • 115200 8N1

ESP32 Serial Monitor & BLE Telemetry Plotter Online

Pre-configured at 115200 baud (CRLF) for ESP32 ROM bootloader output, FreeRTOS/ESP-IDF logs, and BLE NUS telemetry.

Debugging ESP32, ESP32-S3, and ESP32-C3 via WebSerial in Your Browser

Espressif ESP32 microcontrollers default to 115200 baud for both first-stage ROM bootloader diagnostics (ets Jul 29 2019...) and standard ESP_LOGI() / Serial.println() application output.

USB-UART Bridge Chips

Natively compatible with DevKitC boards equipped with Silicon Labs CP2102 / CP2104, WCH CH340C / CH9102, and native USB CDC (ESP32-S3 / C3).

Regex Log Filtering

Enable the .* button in the console and filter with regular expressions like ^(E|W) \( or Guru Meditation|Backtrace to isolate critical FreeRTOS faults.

Logs Only vs. Live Plotter

When your ESP32 streams 50Hz sensor telemetry alongside Wi-Fi/MQTT status events, check Logs Only in the console to hide numeric lines while the chart continues plotting at 60 FPS!

Engineering Documentation & Protocol Reference

Complete Guide: Real-Time Serial Monitor & Plotter via WebSerial and WebBluetooth

Learn how to stream high-frequency sensor telemetry from Arduino, ESP32, RP2040 (Raspberry Pi Pico), and STM32 microcontrollers directly into your browser without installing desktop drivers or heavy IDE suites.

1. How to Use WebSerial with Arduino & ESP32 (C++ Code)

USB CDC / UART

The built-in auto-parser in SerialPulse Studio automatically detects Key:Value pairs and names each variable in the plotter legend. Use 115200 baud (or higher) to minimize UART transmission latency:

// C++ Example for Arduino / ESP32 (50Hz Real-Time Telemetry)
#include <Arduino.h>

unsigned long lastSampleMs = 0;
const unsigned long SAMPLE_INTERVAL_MS = 20; // 50 Hz

void setup() {
  Serial.begin(115200);
  while (!Serial) { delay(10); }
  Serial.println("[SYS] Sensor Node Initialized @ 115200 baud");
}

void loop() {
  unsigned long now = millis();
  if (now - lastSampleMs >= SAMPLE_INTERVAL_MS) {
    lastSampleMs = now;
    float t = now / 1000.0f;

    // Replace with real sensor readings (e.g. BME280, MPU6050, INA219)
    float tempC = 24.5f + 2.5f * sin(2.0f * PI * 0.5f * t);
    float humPct = 55.0f + 5.0f * cos(2.0f * PI * 0.25f * t);
    int adcRaw = analogRead(A0);

    // Key:Value Format (Recommended for named multi-channel plotting)
    Serial.print("Temp:");
    Serial.print(tempC, 2);
    Serial.print(" Hum:");
    Serial.print(humPct, 2);
    Serial.print(" ADC:");
    Serial.println(adcRaw);
  }
}

2. Wireless Telemetry via WebBluetooth (ESP32 BLE NUS)

BLE GATT 6E400001

To monitor mobile robots, drones, or galvanically isolated high-voltage systems, configure your ESP32 or Nordic nRF52 peripheral with the industry-standard Nordic UART Service (NUS) UUIDs:

// Standard Nordic UART Service (NUS) UUIDs
#define SERVICE_UUID           "6e400001-b5a3-f393-e0a9-e50e24dcca9e"
#define CHARACTERISTIC_UUID_RX "6e400002-b5a3-f393-e0a9-e50e24dcca9e"
#define CHARACTERISTIC_UUID_TX "6e400003-b5a3-f393-e0a9-e50e24dcca9e"

// Transmit newline-terminated string via BLE GATT Notify:
char payload[64];
snprintf(payload, sizeof(payload), "Vbat:%.2f Roll:%.1f\n", vbat, roll);
pTxCharacteristic->setValue((uint8_t*)payload, strlen(payload));
pTxCharacteristic->notify();
BLE MTU Note: Default BLE packets carry 20 bytes of payload (or up to 247/512 bytes when negotiating esp_ble_gatt_set_local_mtu(247)). Our line accumulator automatically reassembles fragmented BLE notifications until a \n or \r\n delimiter arrives.

3. Data Formats Supported by the Automatic Serial Plotter

Every line reconstructed by the LineBreakTransformer is inspected in under 0.02 ms and automatically routed into one of four numeric telemetry formats or logged as a system message in the terminal:

A. Key:Value Pairs
Temp:23.5 Hum:45.1 PWM:128

100% compatible with Arduino IDE 2.x Serial Plotter. Accepts : or = separators.

B. CSV (Comma-Separated)
23.50, 45.12, -9.81, 1013.25

Automatically labels channels as CH1, CH2, CH3, CH4 with minimal UART byte overhead.

C. Space / Tab Delimited
23.50 45.12 1023

Ideal for lightweight printf("%f %f\n", a, b) calls in STM32 HAL or bare-metal C.

D. Single-Line JSON
{"v":3.31,"i":0.42,"t":38.5}

Extracts all numeric keys from single-line JSON payloads emitted by ESP-IDF or ArduinoJson.

4. Privacy, Security & Anti-Crash Architecture (Why Your Data Never Leaves Your Browser)

🔒 Direct Hardware USB/BLE → Browser I/O

The native navigator.serial and navigator.bluetooth APIs communicate directly with your operating system's USB/Bluetooth stack only after explicit per-device user permission. Zero bytes of serial telemetry are ever transmitted over the network.

🔄 Zero-Leak Circular Ring Buffer

Conventional web terminals append DOM nodes indefinitely and crash the browser tab after a few minutes at 115200 baud. SerialPulse Studio pre-allocates typed circular buffers (Float64Array) capped at 1,000–10,000 points, keeping RAM usage flat across multi-hour test runs.

⚡ Decoupled 60 FPS Canvas Rendering

Incoming UART stream decoding runs asynchronously in background microtasks, while chart redraws on HTML5 Canvas 2D (uPlot) are batched to your display refresh rate via requestAnimationFrame.