# 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-10-21 ## 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 接口 - **创芯科技 (TCCAN)**:支持创芯 USB CAN 适配器 ### 📊 数据分发 - **双通道分发器**:物理分离的通道数据处理 - **消费者模式**:支持多个数据消费者同时处理 - **统计监控**:实时性能统计和队列状态监控 ### ⚙️ 灵活配置 - **多波特率支持**:5K 到 1000K 波特率 - **扩展帧支持**:标准帧和扩展帧 - **动态配置**:运行时配置修改 ## 支持的设备 | 设备类型 | 厂商 | 波特率范围 | 连接方式 | | -------- | ----------- | ---------- | -------- | | GCAN | 广成科技 | 5K-1000K | USB | | TCAN | 图莫斯 | 5K-1000K | USB | | PCAN | Peak System | 5K-1000K | USB | | TCCAN | 创芯科技 | 5K-1000K | USB | ## 快速开始 ### 安装 ```bash # 通过 NuGet 安装 (示例) Install-Package CanLink ``` ### 基本使用 #### 1. 初始化 CAN 服务 ```csharp using CanLink.Services; using CanLink.Models; // 创建 GCAN 服务实例 var canService = new GCanService(); // 配置 CAN 参数 var config1 = new ChannelInfo { ChannelIndex = 0, // 通道索引 BaudRate = "250K", // 通道波特率 IsReadCanData = true, // 启用数据读取 IsAutoClearCache = true // 自动清除缓存 }; var config2 = new ChannelInfo { ChannelIndex = 1, // 通道索引 BaudRate = "500K", // 通道波特率 IsReadCanData = true, // 启用数据读取 IsAutoClearCache = true // 自动清除缓存 }; // 打开连接 var result = await canService.OpenConnectAsync(0, config1, config2); // 设备索引0,配置两个通道 if (result.IsSuccess) { Console.WriteLine("CAN 设备连接成功!"); } ``` #### 2. 发送 CAN 消息 ##### 异步发送(推荐) ```csharp using CanLink.Models; // 创建单条消息 var message = CanMessageModel.Create( id: 0x123, // CAN ID data: new byte[] { 0x01, 0x02, 0x03, 0x04 }, // 数据 dataLen: 4, // 数据长度 isExtended: false // 标准帧 ); // 创建发送请求,指定通道索引 var request = CanSendRequest.Create(message, 0); // 发送到通道0 // 异步发送消息 var sendResult = await canService.SendCanMsgAsync(request); if (sendResult.IsSuccess) { Console.WriteLine($"通道{sendResult.SendChannelIndex}发送成功!"); } else { Console.WriteLine($"发送失败: {sendResult.ErrorInfo}"); } ``` ##### 多通道并发发送 ```csharp using CanLink.Models; // 创建不同通道的消息 var message1 = CanMessageModel.Create(0x100, new byte[] { 0x01, 0x02 }, 2, false); var message2 = CanMessageModel.Create(0x200, new byte[] { 0x03, 0x04 }, 2, false); // 并发发送到不同通道 var tasks = new[] { canService.SendCanMsgAsync(CanSendRequest.Create(message1, 0)), // 通道0 canService.SendCanMsgAsync(CanSendRequest.Create(message2, 1)) // 通道1 }; var results = await Task.WhenAll(tasks); foreach (var result in results) { if (result.IsSuccess) { Console.WriteLine($"通道{result.SendChannelIndex}发送成功"); } } ``` ##### 高频发送示例 ```csharp using CanLink.Models; // 高频发送多条消息到同一通道 var sendTasks = new List>(); for (int i = 0; i < 100; i++) { var message = CanMessageModel.Create((uint)(0x100 + i), new byte[] { (byte)i }, 1, false); var request = CanSendRequest.Create(message, 0); sendTasks.Add(canService.SendCanMsgAsync(request)); } var results = await Task.WhenAll(sendTasks); var successCount = results.Count(r => r.IsSuccess); Console.WriteLine($"发送完成: {successCount}/{results.Length} 条消息成功"); ``` #### 3. 批量发送消息 ```csharp using CanLink.Models; // 创建消息列表 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 sendTasks = messages.Select(msg => canService.SendCanMsgAsync(CanSendRequest.Create(msg, 0)) // 发送到通道0 ); var results = await Task.WhenAll(sendTasks); var successCount = results.Count(r => r.IsSuccess); Console.WriteLine($"批量发送完成: {successCount}/{messages.Count} 条消息成功"); ``` #### 4. 接收 CAN 数据 ```csharp using CanLink.Interfaces; // 实现数据消费者接口 public class CanDataConsumer : ICanDataConsumer { public void ProcessCanMessage(uint channelIndex, CanMessageModel message) { Console.WriteLine($"通道{channelIndex} 收到消息: ID=0x{message.ID:X}, Data=[{string.Join(",", message.Data.Take(message.DataLen).Select(b => $"0x{b:X2}"))}], {(message.IsExtended ? "扩展帧" : "标准帧")}"); } } // 添加数据消费者到所有通道 var consumer = new CanDataConsumer(); canService.AddDataConsumer(consumer); // 启动数据读取 await canService.StartReadCanDataAsync(); ``` #### 5. 监控设备状态 ```csharp // 检查连接状态 if (canService.IsCanConnect) { Console.WriteLine("CAN设备已连接"); } // 获取队列深度(如果需要监控队列状态) // 注意:具体的统计功能需要根据实际设备实现来获取 ``` #### 6. 清理资源 ```csharp // 停止数据读取 await canService.StopReadCanDataAsync(); // 移除数据消费者 canService.RemoveDataConsumer(consumer); // 关闭连接 await canService.CloseConnectAsync(); // 释放资源 canService.Dispose(); ``` ## 高级用法 ### 切换不同 CAN 设备 ```csharp using CanLink.Services; // 使用广成科技设备 var gcanService = new GCanService(); // 使用图莫斯设备 var tcanService = new TCanService(); // 使用Peak设备 var pcanService = new PCanService(); // 使用创芯科技设备 var tccanService = new TCCanService(); // 所有设备都实现相同的 ICanService 接口 ICanService canService = new GCanService(); // 可以随时切换 ``` ### 扩展帧支持 ```csharp using CanLink.Models; // 创建扩展帧消息 var extendedMessage = CanMessageModel.Create( id: 0x1FFFFFFF, // 29位扩展ID data: new byte[] { 0xFF, 0xEE }, dataLen: 2, isExtended: true // 扩展帧 ); ``` ## API 参考 ### 核心接口 - `ICanService` - CAN 服务核心接口 - `ICanDataConsumer` - 数据消费者接口 ### 核心类和接口 - **ICanService** - 主要服务接口,继承自 ICanConnect、ICanDataRead、ICanDataSend、ICanBaudRate 和 IDisposable - **ICanDataConsumer** - 数据消费者接口,用于处理接收到的CAN消息 - **ChannelInfo** - 通道配置模型,包含通道索引、波特率等配置信息 - **CanMessageModel** - CAN消息模型,包含ID、数据、长度、帧类型等信息 - **CanSendRequest** - 发送请求模型,包含消息和目标通道信息 - **CanSendResponse** - 发送响应模型,继承自CanOperateResult,包含发送结果信息 - **CanOperateResult** - 操作结果基类,包含成功状态和错误信息 ### 支持的设备类型 - **GCanService** - 广成CAN设备 - **TCanService** - Toomoss CAN设备 - **PCanService** - Peak-USB-CAN设备 - **TCCanService** - TC CAN设备 ## 性能特性 ### 高吞吐量设计 - **多通道并发**:每个通道独立的发送队列和处理线程,实现真正的并发发送 - **智能批处理**:自动批量处理发送请求,支持动态批量大小调整 - **对象池优化**:TaskCompletionSource 和发送请求对象复用,减少 GC 压力 - **动态队列容量**:发送队列支持动态扩容,根据负载自动调整容量 - **异步操作**:完全异步的发送 API,支持高并发场景 ### 发送性能优化 - **通道级隔离**:每个通道使用独立的 ChannelSendDispatcher,避免通道间干扰 - **短超时机制**:优先使用 5ms 短超时处理发送请求,提高响应速度 - **线程池集成**:发送处理任务使用 .NET 线程池,提高资源利用率 - **内存优化**:零拷贝消息创建和对象复用机制 ### 可靠性保障 - **错误重试**:发送失败自动重试机制 - **状态监控**:实时设备状态检测 - **异常处理**:完善的异常捕获和恢复 - **资源管理**:自动资源清理和释放 - **线程安全**:所有操作都是线程安全的,支持多线程并发访问 ## 故障排除 ### 常见问题 1. **设备连接失败** - 检查设备驱动是否正确安装 - 确认设备未被其他程序占用 - 验证设备类型和配置参数 2. **消息发送失败** - 检查波特率配置是否匹配 - 确认 CAN 总线连接正常 - 验证消息格式和 ID 范围 3. **数据接收异常** - 确认数据消费者正确注册 - 检查通道配置是否启用 - 验证队列容量设置 ### 调试建议 ```csharp // 检查设备连接状态 if (canService.IsCanConnect) { Console.WriteLine("CAN设备已连接"); } // 注意:具体的性能统计功能需要根据实际设备实现来获取 // 可以通过自定义实现来监控发送和接收的消息数量 ``` ## 系统要求 - .NET Framework 4.8 或更高版本 - Windows 操作系统 - 对应的 CAN 设备驱动程序 ## 许可证 本项目采用 MIT 许可证。详情请参阅 [LICENSE](LICENSE) 文件。