# CanLink **Repository Path**: JueHeng/CanLink ## Basic Information - **Project Name**: CanLink - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-12 - **Last Updated**: 2025-07-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CanLink [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![.NET](https://img.shields.io/badge/.NET-Framework%204.8%2B-blue.svg)](https://dotnet.microsoft.com/) CanLink 是一个用于 .NET 的高性能 CAN(Controller Area Network)通信库,支持 CAN 设备和硬件适配器。 ## 功能特性 ### 🚀 高性能设计 - **多线程优化**:独立的读取和发送线程,提供高吞吐量 - **智能批处理**:自动根据消息数量选择单条或批量发送 - **内存优化**:消息池复用,减少 GC 压力 - **异步支持**:完整的异步 API 设计 ### 🔌 多设备支持 - **广成科技 (GCAN)**:支持双通道高速数据传输 - **图莫斯 (TCAN)**:支持 USB CAN 适配器 - **Peak (PCAN)**:支持 Peak System 的 CAN 接口 ### 📊 数据分发 - **双通道分发器**:物理分离的通道数据处理 - **消费者模式**:支持多个数据消费者同时处理 - **统计监控**:实时性能统计和队列状态监控 ### ⚙️ 灵活配置 - **多波特率支持**:50K 到 1M 波特率 - **扩展帧支持**:标准帧和扩展帧 - **动态配置**:运行时配置修改 ## 支持的设备 | 设备类型 | 厂商 | 通道数 | 波特率范围 | |---------|------|--------|------------| | GCAN | 广成科技 | 双通道 | 50K-1000K | | TCAN | 图莫斯 | 双通道 | 50K-1000K | | PCAN | Peak System | 单通道 | 5K-1M | ## 快速开始 ### 安装 ```bash # 通过 NuGet 安装 (示例) Install-Package CanLink ``` ### 基本使用 #### 1. 初始化 CAN 服务 ```csharp using CanLink.Services; using CanLink.Models; // 创建 GCAN 服务实例 var canService = new GCanService(); // 配置 CAN 参数 var config = new CanConfigModel { CanFirstBaudrate = "250K", // 通道1波特率 CanSecondBaudrate = "500K", // 通道2波特率 IsOpenCanFirst = true, // 启用通道1 IsOpenCanSecond = true, // 启用通道2 IsReadCanData = true, // 启用数据读取 IsReadCanDataFirst = true, // 读取通道1数据 IsReadCanDataSecond = true // 读取通道2数据 }; // 打开连接 var result = await canService.OpenConnectAsync(config); if (result.IsSuccess) { Console.WriteLine("CAN 设备连接成功!"); } ``` #### 2. 发送 CAN 消息 ```csharp // 创建单条消息 var message = CanMessageModel.Create( id: 0x123, // CAN ID data: new byte[] { 0x01, 0x02, 0x03, 0x04 }, // 数据 dataLen: 4, // 数据长度 isExtended: false // 标准帧 ); // 创建发送请求 var request = CanSendRequest.Create(message); // 发送到通道1 var sendResult = canService.SendCanMsgFirst(request); if (sendResult.IsSuccess) { Console.WriteLine($"发送成功!发送数量: {sendResult.SendSuccessCount}"); } ``` #### 3. 批量发送消息 ```csharp // 创建消息列表 var messages = new List { CanMessageModel.Create(0x100, new byte[] { 0x01, 0x02 }, 2, false), CanMessageModel.Create(0x101, new byte[] { 0x03, 0x04 }, 2, false), CanMessageModel.Create(0x102, new byte[] { 0x05, 0x06 }, 2, false) }; // 创建批量发送请求 var batchRequest = CanSendRequest.Create(messages); // 自动选择批量发送(因为有多条消息) var batchResult = canService.SendCanMsgFirst(batchRequest); Console.WriteLine($"批量发送完成!成功: {batchResult.SendSuccessCount} 条"); ``` #### 4. 接收 CAN 数据 ```csharp // 实现数据消费者接口 public class CanDataConsumer : ICanDataConsumer { public void OnCanDataReceived(List messages, int channelIndex) { foreach (var msg in messages) { Console.WriteLine($"通道{channelIndex} 收到消息: ID=0x{msg.ID:X}, Data=[{string.Join(",", msg.Data.Take(msg.DataLen).Select(b => $"0x{b:X2}"))}]"); } } } // 添加数据消费者 var consumer = new CanDataConsumer(); canService.AddDataConsumer(consumer); // 启动数据读取 canService.StartReadCanData(); ``` #### 5. 监控性能统计 ```csharp // 获取读取统计 var (totalRead, readCycles, avgRead) = canService.GetReadingStatistics(); Console.WriteLine($"读取统计: 总消息{totalRead}, 周期{readCycles}, 平均{avgRead:F2}"); // 获取发送统计 var (totalSent, sendCycles, avgSent) = canService.GetSendingStatistics(); Console.WriteLine($"发送统计: 总消息{totalSent}, 周期{sendCycles}, 平均{avgSent:F2}"); // 获取通道统计 var (queueCount, isRunning, processed, dropped) = canService.GetChannelStatistics(0); Console.WriteLine($"通道0: 队列{queueCount}, 运行{isRunning}, 处理{processed}, 丢弃{dropped}"); ``` #### 6. 清理资源 ```csharp // 停止数据读取 canService.StopReadCanData(); // 移除数据消费者 canService.RemoveDataConsumer(consumer); // 关闭连接 await canService.CloseConnectAsync(); // 释放资源 canService.Dispose(); ``` ## 高级用法 ### 切换不同 CAN 设备 ```csharp // 使用图莫斯设备 var tcanService = new TCanService(); // 使用 Peak 设备 var pcanService = new PCanService(); // 所有设备都实现相同的 ICanService 接口 ICanService canService = new GCanService(); // 可以随时切换 ``` ### 自定义数据分发器容量 ```csharp // 设置队列容量为 5000 canService.SetDispatcherCapacity(5000); ``` ### 扩展帧支持 ```csharp // 创建扩展帧消息 var extendedMessage = CanMessageModel.Create( id: 0x1FFFFFFF, // 29位扩展ID data: new byte[] { 0xFF, 0xEE }, dataLen: 2, isExtended: true // 扩展帧 ); ``` ## API 参考 ### 核心接口 - `ICanService` - CAN 服务核心接口 - `ICanDataConsumer` - 数据消费者接口 ### 主要类 - `CanMessageModel` - CAN 消息模型 - `CanSendRequest` - 发送请求模型 - `CanSendResponse` - 发送响应模型 - `CanOperateResult` - 操作结果模型 - `CanConfigModel` - 配置模型 ### 服务类 - `GCanService` - 广成科技设备服务 - `TCanService` - 图莫斯设备服务 - `PCanService` - Peak 设备服务 ## 性能特性 - **读取性能**: 支持每秒数千条消息的高速读取 - **发送性能**: 智能批处理,优化发送吞吐量 - **内存效率**: 消息池复用,最小化 GC 影响 - **线程安全**: 完全线程安全的设计 ## 系统要求 - .NET Framework 4.8 或更高版本 - Windows 操作系统 - 对应的 CAN 设备驱动程序 ## 许可证 本项目采用 [MIT 许可证](LICENSE)。