FEATURES · FIRMWARE & PROTOCOL

From your MCU to the wire.

Start with the Serial.print you already have, or use KymoCore for compact binary frames, device time, trace and live parameters. KymoProbe has ready-made examples.

The problem

Formatting text costs CPU time and blocks the loop, one number per line gives one curve at best, and parsing on the PC breaks on every typo.

What Kymotrace does

KymoStudio reads common text lines as they are. When you need more, KymoCore schedules your channels, encodes them into 9–21 byte frames and hands them to any transport – without heap, RTOS or blocking.

Two ways

PATH A · NO LIBRARY

Text lines from existing firmware

>temp:23.5                 Teleplot
temp=23.5 hum=41           name=value / name:value
23.5,41                    CSV columns

Named values get a stable signal and become the curve label. A line is taken completely or not at all. Works on serial, TCP, UDP and MQTT.

PATH B · WITH KYMOCORE

Binary frames, device time, back channel

lib_deps = codename666/KymoCore@^7.1.0

Up to 256 channels with their own rate, Y, XY or XYZ, optional timestamp and CRC-8. Runtime trace and live parameters on the same link.

Two calls. That's the API.

Describe your channels once, call Kymo_Init() at start-up and Kymo_Main() in your loop. KymoCore decides which channel is due, asks your callback for the value and never waits for the interface.

  • MCUs & SoCs · platform callbacks
  • Examples: Arduino · ESP32 · STM32
  • C99 API / C++11

KymoCore on PlatformIO →

// kymo_config.cpp – your measurement
static uint8_t sample(void *, uint8_t id, KymoSample *out)
{
    out->value = id == 0 ? readTemperature() : readPressure();
    return 1;
}

static const KymoChannel channels[] = {
    {20,  0, 0},   // channel 0 every 20 ms
    {100, 1, 0}    // channel 1 every 100 ms
};

// main.cpp
static KymoContext kymo;
void setup() { Serial.begin(115200); Kymo_Init(&kymo, &kymo_config); }
void loop()  { Kymo_Main(&kymo); }

Every byte earns its place.

Build a frame yourself. Toggle the optional fields and watch layout, length and checksum change – these are the exact bytes on the wire.

SYNCDESCID XYZTIMECRC / 00

Full protocol, including trace and back channel →

KymoCore and KymoProbe

Never blocks

No heap, RTOS, exceptions or RTTI. You provide a write callback, KymoCore provides the bytes.

Any interface

UART, USB CDC, Wi-Fi with TCP or UDP, MQTT, CAN.

Transport multiplexer

Data and trace share one link fairly, with partial writes, backpressure and borrowed DMA buffers.

Live parameters

KYMO_PARAM registers tunable variables; the device reports them and confirms every write.

Compile-out for production

KYMO_ENABLED=0 removes all instrumentation; its arguments are not even evaluated.

Configurator

CLI and optional Qt editor for versioned project profiles with exports for GCC, CMake and PlatformIO.

KymoProbe examples

ESP32, Arduino Uno/Nano/Mega and STM32, built in CI: serial, Wi-Fi with TCP and MQTT, trace demo, PI controller, text lines.

Stress tests

Generated profiles and stress demos for USB and TCP to test throughput.

Open source

KymoCore and KymoProbe are available under GPLv3; a commercial license exists for proprietary firmware.

kymocore on GitHub → · kymoprobe on GitHub →

Key points

  • Text lines need no library at all
  • KymoCore: binary float32 frames of 9–21 bytes, up to 256 channels
  • Self-synchronising, optional CRC-8
  • Hardware-neutral; Arduino, ESP32 and STM32 are examples, not a restriction

Honest limits

  • Text lines carry no device time and no trace or back channel
  • Porting needs a compatible toolchain, enough memory and the platform callbacks
  • ISR and scheduler coverage depends on your platform port

Flash an example and see data within minutes.

Quick start KymoProbe examples