<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pkuyo</title>
    <description>The latest articles on DEV Community by Pkuyo (@pkuyo).</description>
    <link>https://dev.to/pkuyo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554915%2F98e90bb9-9c0b-4d0b-8861-4f9939f9799a.jpeg</url>
      <title>DEV Community: Pkuyo</title>
      <link>https://dev.to/pkuyo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pkuyo"/>
    <language>en</language>
    <item>
      <title>CanKit early preview: capability discovery, a ready-to-run CAN demo</title>
      <dc:creator>Pkuyo</dc:creator>
      <pubDate>Tue, 21 Oct 2025 07:23:59 +0000</pubDate>
      <link>https://dev.to/pkuyo/cankit-early-preview-capability-discovery-a-ready-to-run-can-demo-285k</link>
      <guid>https://dev.to/pkuyo/cankit-early-preview-capability-discovery-a-ready-to-run-can-demo-285k</guid>
      <description>&lt;p&gt;I’ve been building &lt;strong&gt;CanKit&lt;/strong&gt;, a small, unified C# API for CAN bus.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 A ready-to-run CAN listener/sender demo using CanKit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Connect to different devices/backends (Support PCan-Basic, Kvaser Canlib, ZlgCan, SocketCAN. And need install drivers first)&lt;/li&gt;
&lt;li&gt;Send &amp;amp; receive frames&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;ID filters&lt;/strong&gt; (if hardware not support will use software filter)&lt;/li&gt;
&lt;li&gt;Flip between &lt;strong&gt;CAN 2.0&lt;/strong&gt; and &lt;strong&gt;CAN FD&lt;/strong&gt; where supported&lt;/li&gt;
&lt;li&gt;Periodic transmit window: build a list of frames with periods, enable/disable items, run/stop as a group.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsqqzibb0dh0yax3qyzqx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsqqzibb0dh0yax3qyzqx.png" alt="WPFdemo1" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7uctqpf5f6u3gxqp8yv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7uctqpf5f6u3gxqp8yv.png" alt="WPFdemo2" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 capability discovery
&lt;/h3&gt;

&lt;p&gt;Before opening a channel, query what the device supports (e.g., CAN FD availability, filter capabilities).&lt;br&gt;
This reduces guesswork and speeds up bring-up.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ CI-friendly: fake backend
&lt;/h3&gt;

&lt;p&gt;Hardware-less pipelines are real: the &lt;strong&gt;fake backend&lt;/strong&gt; lets us run CI tests and examples without a CAN dongle attached.&lt;br&gt;
If you’re evaluating CanKit in your own project, you can use this backend for your tests too.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 What is CanKit?
&lt;/h2&gt;

&lt;p&gt;CanKit is a C# library aiming to smooth over vendor differences so your app code stays portable.&lt;br&gt;
It’s 0.3.2 and iterating quickly—expect changes while we stabilize the API with community feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  🗂️ Help fill the compatibility matrix (testers wanted!)
&lt;/h3&gt;

&lt;p&gt;Have a CAN device? Please:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run the demo&lt;/li&gt;
&lt;li&gt;Share &lt;strong&gt;device model&lt;/strong&gt;, &lt;strong&gt;backend&lt;/strong&gt;, &lt;strong&gt;OS&lt;/strong&gt;, &lt;strong&gt;bit rate&lt;/strong&gt;, &lt;strong&gt;CAN 2.0 / FD&lt;/strong&gt;, and whether &lt;strong&gt;filters&lt;/strong&gt; worked&lt;/li&gt;
&lt;li&gt;Include a short log or open an issue/PR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even a quick “works on  @ 250 kbps” is valuable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Links&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/pkuyo/CanKit" rel="noopener noreferrer"&gt;https://github.com/pkuyo/CanKit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Nuget: &lt;a href="https://www.nuget.org/packages/CanKit.Core" rel="noopener noreferrer"&gt;https://www.nuget.org/packages/CanKit.Core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Earlier intro (v0.2.0): &lt;a href="https://dev.to/pkuyo/cankit-a-unified-c-api-for-can-bus-looking-for-testers-feedback-2m8k"&gt;https://dev.to/pkuyo/cankit-a-unified-c-api-for-can-bus-looking-for-testers-feedback-2m8k&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>csharp</category>
      <category>dotnet</category>
      <category>iot</category>
    </item>
    <item>
      <title>CanKit: a unified c# API for CAN bus (looking for testers &amp; feedback)</title>
      <dc:creator>Pkuyo</dc:creator>
      <pubDate>Mon, 13 Oct 2025 03:13:18 +0000</pubDate>
      <link>https://dev.to/pkuyo/cankit-a-unified-c-api-for-can-bus-looking-for-testers-feedback-2m8k</link>
      <guid>https://dev.to/pkuyo/cankit-a-unified-c-api-for-can-bus-looking-for-testers-feedback-2m8k</guid>
      <description>&lt;h2&gt;
  
  
  Why I’m building this
&lt;/h2&gt;

&lt;p&gt;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 &lt;strong&gt;CanKit&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What works today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One API surface for classic CAN 2.0 and CAN-FD&lt;/li&gt;
&lt;li&gt;Open by endpoint strings or typed helpers; enumerate endpoints&lt;/li&gt;
&lt;li&gt;Sync/async I/O, basic events (frame received, errors), filtering (mask/range), and periodic transmit&lt;/li&gt;
&lt;li&gt;Adapters: PCAN-Basic (Peak), Kvaser CANlib, SocketCAN (Linux), ZLG&lt;/li&gt;
&lt;li&gt;Targets: .NET Standard 2.0 and .NET 8&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Some behaviors vary by adapter (timeouts, hardware filters, error frames, periodic TX). The docs call out some differences and fallbacks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;CanKit.Core&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;CanKit.Core.Definitions&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Open a bus (example: SocketCAN) and set classic bit timing&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;bus&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CanKit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CanBus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"socketcan://can0#netlink"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cfg&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TimingClassic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;500_000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Send a classic CAN frame&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CanClassicFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0x123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="m"&gt;0x11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0x33&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Transmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you prefer strongly-typed helpers, some adapters have them (e.g., Kvaser).&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap / Where I need help
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Broader device coverage &amp;amp; validation across OSes&lt;/li&gt;
&lt;li&gt;Sharper adapter-specific docs and samples&lt;/li&gt;
&lt;li&gt;Edge cases around timeouts/filters on certain devices&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;I’m actively improving things; &lt;strong&gt;bug reports, device notes, and PRs are super welcome&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How you can help
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Try it&lt;/strong&gt; with your adapter(s) and share logs or findings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open issues&lt;/strong&gt; for missing features, confusing docs, or rough edges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send PRs&lt;/strong&gt;—even small ones (typos, samples) help a lot&lt;/li&gt;
&lt;li&gt;Suggest real-world use cases I should cover in samples&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repo &amp;amp; Docs: &lt;a href="https://github.com/pkuyo/CanKit" rel="noopener noreferrer"&gt;https://github.com/pkuyo/CanKit&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>csharp</category>
      <category>showdev</category>
      <category>iot</category>
      <category>automotive</category>
    </item>
  </channel>
</rss>
