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" />
<PackageReference Include="CanLink" />
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
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#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
#tool nuget:?package=CanLink&version=6.2.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
CanLink
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 | Versions 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.
-
net8.0
- CanLink.Core (>= 2.1.0)
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 |
Loading failed