256 Kanäle, eigener Takt
Jeder Kanal hat sein eigenes Abtastintervall; ein Round-Robin-Scheduler entscheidet, wer an der Reihe ist.
KymoCore · C++11 / C-API
KymoCore liest deine Messwerte im eingestellten Takt, packt sie in Binärframes von 9 bis 21 Byte und übergibt sie an jede beliebige Schnittstelle – ohne Heap, ohne RTOS und ohne die Hauptschleife zu blockieren. Am PC zeigt KymoStudio die Signale live.
Jeder Kanal hat sein eigenes Abtastintervall; ein Round-Robin-Scheduler entscheidet, wer an der Reihe ist.
Optional mit Zeitstempel und CRC-8. float32, Little Endian, ein festes und dokumentiertes Protokoll.
Kymo_Init() einmal, Kymo_Main() in der Schleife. Kein Heap, kein RTOS, keine Exceptions, kein RTTI.
UART, USB CDC, WLAN mit TCP oder UDP, MQTT, CAN – du lieferst einen Write-Callback, KymoCore die Bytes.
Teilweise Übertragungen, Backpressure und geliehene DMA-Puffer werden sauber behandelt.
Optionale Makros für Scopes, Marker, ISRs und Scheduler-Wechsel. KYMO_ENABLED=0 entfernt alles für Produktions-Builds.
Schnellstart
Trage KymoCore in die platformio.ini deines Projekts ein:
lib_deps =
codename666/KymoCore
Diese src/main.cpp sendet mit den Standardeinstellungen alle 20 ms einen Sägezahn zwischen 0 und knapp 1 auf Kanal 0. Die serielle Schnittstelle trägt nur Binärdaten – Diagnoseausgaben würden den Datenstrom stören.
#include <Arduino.h>
#include <kymo_runtime.h>
static KymoContext context = {};
static KymoStatus lastStatus = KYMO_BAD_CONFIG;
static uint32_t lastSampleMs[1] = {};
static const KymoChannel channels[] = {{20U, 0U, 0U}};
static uint32_t readClockMs(void *user)
{
(void)user;
return static_cast<uint32_t>(millis());
}
static uint8_t readSample(void *user, uint8_t id, KymoSample *out)
{
(void)user;
(void)id;
if (out == nullptr) {
return 0U;
}
out->value = static_cast<float>(millis() % 1000UL) / 1000.0f;
return 1U;
}
static uint8_t writeBytes(void *user, const uint8_t *bytes, uint8_t length)
{
int available = Serial.availableForWrite();
(void)user;
if ((bytes == nullptr) || (available <= 0)) {
return 0U;
}
if (available < length) {
length = static_cast<uint8_t>(available);
}
return static_cast<uint8_t>(Serial.write(bytes, length));
}
static const KymoConfig config = {
channels, lastSampleMs, readClockMs, nullptr, readSample, nullptr,
writeBytes, nullptr, nullptr, nullptr, 1U
};
void setup()
{
Serial.begin(115200);
lastStatus = Kymo_Init(&context, &config);
}
void loop()
{
if ((lastStatus != KYMO_BAD_CONFIG) && (lastStatus != KYMO_IO_ERROR)) {
lastStatus = Kymo_Main(&context);
}
}
Mit pio run bauen, mit pio run -t upload flashen, einen offenen seriellen Monitor schließen und KymoStudio mit 115200 Baud, 8N1 verbinden. Kanal 0 einem Diagramm zuweisen.
KymoCore enthält keine Hardwaretreiber: Du bindest dein Zielsystem über Callbacks für Zeit, Abtastung und Transport an. Dadurch bleibt die Bibliothek vom Arduino Uno bis zum STM32 mit DMA gleich. Die KymoProbe-Beispiele decken Arduino Uno, Nano und Mega ab, ESP32, ESP32-S3 und ESP32-C3 sowie STM32 Nucleo F401RE, F411RE und Blue Pill F103C8 – das sind Beispielportierungen, keine Einschränkung.
KymoCore ist doppelt lizenziert: GPLv3, kostenlos für Hobby-, Lern- und Open-Source-Projekte, oder eine kommerzielle Lizenz für Firmware und Geräte, die ohne Offenlegung des eigenen Quellcodes vertrieben werden. Details in den Lizenzbedingungen.
Protokollspezifikation → Leitfaden und API-Referenz → Alle KymoCore-Funktionen →