This content originally appeared on DEV Community and was authored by Pkuyo
Why I’m building this
When you jump between different CAN adapters, each SDK has its own model, types, and quirks. I wanted a single, clean API that lets you open a bus, send/receive frames, set filters, and do periodic TX—without rewriting everything for each vendor. That became CanKit.
What works today
- One API surface for classic CAN 2.0 and CAN-FD
- Open by endpoint strings or typed helpers; enumerate endpoints
- Sync/async I/O, basic events (frame received, errors), filtering (mask/range), and periodic transmit
- Adapters: PCAN-Basic (Peak), Kvaser CANlib, SocketCAN (Linux), ZLG
- Targets: .NET Standard 2.0 and .NET 8
Note: Some behaviors vary by adapter (timeouts, hardware filters, error frames, periodic TX). The docs call out some differences and fallbacks.
Quick start
using CanKit.Core;
using CanKit.Core.Definitions;
// Open a bus (example: SocketCAN) and set classic bit timing
using var bus = CanKit.Core.CanBus.Open(
"socketcan://can0#netlink",
cfg => cfg.TimingClassic(500_000));
// Send a classic CAN frame
var frame = new CanClassicFrame(0x123, new byte[] { 0x11, 0x22, 0x33 });
bus.Transmit(new[] { frame });
If you prefer strongly-typed helpers, some adapters have them (e.g., Kvaser).
Roadmap / Where I need help
- Broader device coverage & validation across OSes
- Sharper adapter-specific docs and samples
- Edge cases around timeouts/filters on certain devices
I’m actively improving things; bug reports, device notes, and PRs are super welcome.
How you can help
- Try it with your adapter(s) and share logs or findings
- Open issues for missing features, confusing docs, or rough edges
- Send PRs—even small ones (typos, samples) help a lot
- Suggest real-world use cases I should cover in samples
Links
- Repo & Docs: https://github.com/pkuyo/CanKit
This content originally appeared on DEV Community and was authored by Pkuyo