CanLink 6.2.0

dotnet add package CanLink --version 6.2.0
                    
NuGet\Install-Package CanLink -Version 6.2.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="CanLink" Version="6.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="CanLink" Version="6.2.0" />
                    
Directory.Packages.props
<PackageReference Include="CanLink" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add CanLink --version 6.2.0
                    
#r "nuget: CanLink, 6.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package CanLink@6.2.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=CanLink&version=6.2.0
                    
Install as a Cake Addin
#tool nuget:?package=CanLink&version=6.2.0
                    
Install as a Cake Tool

License: MIT .NET

CanLink 是一个用于 .NET 8 的高性能 CAN(Controller Area Network)通信库,采用现代化设计,支持多种 CAN 硬件适配器和 CAN FD 协议。

功能特性

现代化架构

  • 精简接口ICanDevice + ICanChannel 双接口,职责清晰
  • 真实异步ValueTask + CancellationToken,非 Task.Run 伪异步
  • 背压控制:基于 System.Threading.Channels 的接收缓冲,支持 Wait/DropOldest/DropNewest 策略
  • 异常驱动:摒弃 CanOperateResult,失败直接抛异常,符合 .NET 惯例

异步流消费

  • 流模式await foreach (var frame in channel.ReadAllAsync()),高性能,天然支持背压
  • 调用端可基于流自行实现事件分发或多路广播

波特率枚举与查询

  • CanBaudRate 枚举:类型安全的波特率配置,避免裸 uint 魔法数字
  • GetSupportedBaudRates():运行前查询设备实际支持的波特率列表

多设备与 CAN FD 支持

包名 厂商 连接方式 CAN FD
CanLink 广成科技 / 图莫斯 / 创芯 USB
CanLink.PCan PEAK-System USB/PCI/LAN

串口/网口 CAN 扩展正在规划中。

安装

dotnet add package CanLink          # 广成/图莫斯/创芯
dotnet add package CanLink.PCan     # PEAK-System(可选)

快速开始

1. 查询设备支持的波特率

using CanLink.Core;
using CanLink.Devices.GuangCheng;

var device = new GuangChengCanDevice(0,
    new CanChannelConfig { Index = 0, BaudRate = CanBaudRate.Baud250K });

// 连接前查询设备支持哪些波特率
var rates = device.GetSupportedBaudRates();
Console.WriteLine($"支持的波特率: {string.Join(", ", rates)}");
// 输出: 支持的波特率: Baud5K, Baud10K, Baud20K, Baud40K, Baud50K ...

2. 连接设备并发送消息

using CanLink.Core;
using CanLink.Devices.GuangCheng;

// 创建设备,配置通道
await using var device = new GuangChengCanDevice(0,
    new CanChannelConfig { Index = 0, BaudRate = CanBaudRate.Baud250K },
    new CanChannelConfig { Index = 1, BaudRate = CanBaudRate.Baud500K });

// 连接
await device.ConnectAsync();
Console.WriteLine($"已连接: {device.DeviceName}, SN={device.SerialNumber}");

// 启动通道接收
var ch0 = device.Channels[0];
await ch0.StartAsync();

// 发送一帧
var frame = CanFrame.Create(0x123, new byte[] { 0x01, 0x02, 0x03, 0x04 }, isExtended: true);
await ch0.SendAsync(frame);

3. 异步流模式接收数据

var cts = new CancellationTokenSource();
var channel = device.Channels[0];
await channel.StartAsync();

await foreach (var frame in channel.ReadAllAsync(cts.Token))
{
    Console.WriteLine($"[流式] {frame}");
}

4. 并发压力测试

var frame = CanFrame.Create(0x100, new byte[] { 0xAA });
var stopwatch = Stopwatch.StartNew();

var tasks = device.Channels.Select(ch =>
    Task.Run(async () =>
    {
        for (int i = 0; i < 1000; i++)
            await ch.SendAsync(frame);
    })
).ToArray();

await Task.WhenAll(tasks);
stopwatch.Stop();
Console.WriteLine($"{tasks.Length * 1000} 帧 / {stopwatch.ElapsedMilliseconds}ms");

5. CAN FD 发送(PCAN)

using CanLink.PCan.Devices.PCan;

await using var pcan = new PeakCanDevice(0,
    new CanChannelConfig { Index = 0, BaudRate = CanBaudRate.Baud500K, IsCanFd = true, FdDataBaudRate = CanBaudRate.Baud1000K });

await pcan.ConnectAsync();

var fdFrame = CanFrame.CreateCanFd(0x123, new byte[64], isExtended: false);
await pcan.Channels[0].SendAsync(fdFrame);

6. 动态波特率切换

var channel = device.Channels[0];

// 部分设备(如 PCAN)支持运行时切换波特率
await channel.UpdateBaudRateAsync(CanBaudRate.Baud500K);
Console.WriteLine($"当前波特率已切换为: {channel.Config.BaudRate}");

// 切换后可立即恢复收发,无需断开重连

API 参考

核心模型

// 统一消息帧(值类型)
public readonly record struct CanFrame
{
    public uint Id { get; init; }
    public ReadOnlyMemory<byte> Data { get; init; }
    public bool IsExtended { get; init; }
    public bool IsRemote { get; init; }
    public bool IsCanFd { get; init; }
    public DateTimeOffset Timestamp { get; init; }
}

// 通道配置
public sealed class CanChannelConfig
{
    public required uint Index { get; init; }
    public required CanBaudRate BaudRate { get; init; }   // 如 CanBaudRate.Baud250K
    public bool IsCanFd { get; init; }
    public CanBaudRate FdDataBaudRate { get; init; }
    public bool AutoStart { get; init; } = true;
    public int ReceiveBufferCapacity { get; init; } = 1000;
    public BufferFullMode FullMode { get; init; } = BufferFullMode.DropOldest;
}

ICanDevice

public interface ICanDevice : IAsyncDisposable
{
    string DeviceName { get; }
    string? SerialNumber { get; }
    bool IsConnected { get; }
    IReadOnlyList<ICanChannel> Channels { get; }

    ValueTask ConnectAsync(CancellationToken cancellationToken = default);
    ValueTask DisconnectAsync(CancellationToken cancellationToken = default);
    ValueTask<CanDeviceInfo> GetDeviceInfoAsync(CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取设备支持的所有波特率列表
    /// </summary>
    IReadOnlyList<CanBaudRate> GetSupportedBaudRates();
}

ICanChannel

public interface ICanChannel
{
    uint Index { get; }
    CanChannelConfig Config { get; }
    bool IsRunning { get; }

    IAsyncEnumerable<CanFrame> ReadAllAsync(CancellationToken cancellationToken = default);

    ValueTask StartAsync(CancellationToken cancellationToken = default);
    ValueTask StopAsync(CancellationToken cancellationToken = default);
    ValueTask SendAsync(CanFrame frame, CancellationToken cancellationToken = default);
    ValueTask ClearBufferAsync(CancellationToken cancellationToken = default);
    ValueTask UpdateBaudRateAsync(CanBaudRate baudRate, CancellationToken cancellationToken = default);
}

异常体系

异常 说明
CanDeviceNotFoundException 设备未找到
CanConnectionException 连接失败
CanChannelException 通道操作失败
CanSendException 发送失败

设备初始化

广成科技 (ZLG)

using CanLink.Devices.GuangCheng;

var device = new GuangChengCanDevice(
    deviceType: 4,      // 设备类型
    deviceIndex: 0,     // 设备索引
    new CanChannelConfig { Index = 0, BaudRate = CanBaudRate.Baud250K },
    new CanChannelConfig { Index = 1, BaudRate = CanBaudRate.Baud250K }
);

图莫斯 (Toomoss)

using CanLink.Devices.Toomoss;

var device = new ToomossCanDevice(0,
    new CanChannelConfig { Index = 0, BaudRate = CanBaudRate.Baud250K });

创芯 (ChuangXin)

using CanLink.Devices.ChuangXin;

var device = new ChuangXinCanDevice(0,
    new CanChannelConfig { Index = 0, BaudRate = CanBaudRate.Baud250K });

PEAK-System (PCAN)

using CanLink.PCan.Devices.PCan;

var device = new PeakCanDevice(0,
    new CanChannelConfig { Index = 0, BaudRate = CanBaudRate.Baud250K });

项目结构

CanLink/
├── CanLink.Core/       # 核心抽象(net8.0)
├── CanLink/            # 广成/图莫斯/创芯(net8.0)
├── CanLink.PCan/       # PCAN(net8.0)
└── NetConsoleDemo/     # 控制台示例

系统要求

  • .NET 8.0 或更高版本
  • Windows 操作系统
  • 对应厂商的 CAN 设备驱动程序

许可证

MIT License

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
6.2.0 52 5/11/2026
6.0.0 59 5/9/2026
5.3.1 139 1/30/2026
5.2.1 234 10/21/2025
5.2.0 191 10/17/2025
5.1.0 210 10/13/2025
5.0.2 136 10/11/2025
5.0.1 188 10/10/2025
4.3.4 299 9/22/2025
4.3.1.2 231 6/16/2025
4.2.0 366 6/10/2025
4.1.1 205 6/6/2025
3.0.1 307 5/15/2025
2.0.7 220 5/6/2025
2.0.6 367 4/17/2025 2.0.6 is deprecated because it has critical bugs.
Loading failed