当前位置: 首页 > news >正文

拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用

拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用

今天给大家介绍一个封装完善的CAN卡类。

背景

在面对常规开发场景,开发者对复杂SDK进行封装和测试。阅读相关开发资料和理解SDK的DEMO程序。

开篇

如果你也有同样的烦恼,那就来看看今天跟大家分享的库。

Gycylm.Tools.Devices.Cans.Zlg (获取方法放在文末尾)

该库文件提供一个非常好用的类CanCommService,提供了我们想要访问设备的所有操作,精巧的封装到3个事件、和4个方法中。如下所示:

        /// <summary>/// 当通道断开了,通知外部/// </summary>event Action<ChannelConfig> ChannelDisconned;/// <summary>/// 当数据收到了,通知外部/// </summary>event Action<ICanChannelService, List<UniversalCanMessage>> CanDataComed;/// <summary>/// 当有数据发送出去时,通知外部/// </summary>event Action<ICanChannelService, List<UniversalCanMessage>> CanDataSent;/// <summary>/// 发生数据/// </summary>/// <param name="ccc"></param>/// <param name="protocolId"></param>/// <param name="data"></param>/// <returns></returns>Boolean Send(ChannelConfig ccc, UInt32 protocolId, Byte[] data);/// <summary>/// 打开指定通道/// </summary>/// <param name="ccc">通道配置信息</param>/// <returns></returns>Boolean Open(ChannelConfig ccc);/// <summary>/// 关闭指定 <see cref="ChannelConfig.Id"/> 的通道/// </summary>/// <param name="id">通道配置信息的<see cref="ChannelConfig.Id"/></param>/// <returns></returns>Boolean Close(UInt32 id);/// <summary>/// 关闭所有通道/// </summary>void CloseAll();

该方法是针对所有的基础CAN卡通信的封装,可以通过使用上面的方法实现对CAN设备的基本操作

  • 配置

  • 打开

  • 关闭

  • 数据发送

  • 数据接收

同时支持CAN/CANFD,通道分离,支持ZLG的USB CAN卡设备。

CAN卡配置信息如下

   /// <summary>/// CAN 设备通道配置信息/// </summary>public class ChannelConfig{/// <summary>/// CAN 设备通道唯一 ID/// </summary>public UInt32 Id { get; set; }
​/// <summary>/// CAN 设备类型,具体见 CanCategory 枚举/// </summary>public CanCategory CCategroy { get; set; } = CanCategory.ZLG_USBCAN_2;
​/// <summary>/// CAN 设备索引 0 1 2 3 4 .../// </summary>public Byte CanIndex { get; set; }
​/// <summary>/// 通道索引 0 1 2 3 .../// </summary>public Byte ChannelIndex { get; set; }
​/// <summary>/// 数据协议/// </summary>public DataProtocol DataProto { get; set; } = DataProtocol.CAN;
​/// <summary>/// 通道波特率/// </summary>public ChannelBaudRate BaudRate { get; set; } = ChannelBaudRate._1000Kbps;
​/// <summary>/// 数据波特率/// </summary>public ChannelDataBaudRate DataBaudRate { get; set; } = ChannelDataBaudRate.None;/// <summary>/// 启用终端电阻/// </summary>public ChannelInternalResistance InternalResistance { get; set; } = ChannelInternalResistance.Disable;
​public override string ToString(){return $"Id = {Id};\n" +$"CCategroy = {CCategroy};\n" +$"CanIndex = {CanIndex};\n" +$"ChannelIndex = {ChannelIndex};\n" +$"DataProto = {DataProto};\n" +$"BaudRate = {BaudRate};\n" +$"DataBaudRate = {DataBaudRate};\n" +$"InternalResistance = {InternalResistance}";}}
​

CAN 消息定义如下:

 [StructLayout(LayoutKind.Sequential, Pack = 1)]public struct UniversalCanMessage{/// <summary>/// 报文 ID/// </summary>public UInt32 ID;/// <summary>/// 报文数据内容长度/// 不是DataLengthCode/// 如果需要获得真实的DLC,需要自己再换算<see cref="DataConverter.DataLen2DLC(int)"/>/// </summary>public Byte DLC;/// <summary>/// CAN 通道接收时间戳,相对于 CAN 打开时间,单位微秒/// </summary>public UInt64 TIMESTAMP;/// <summary>/// 报文数据内容,根据 DLC 来判断真实有效数据内容/// </summary>[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]public Byte[] DATA;
​public override string ToString(){var sb = new System.Text.StringBuilder();sb.AppendLine($"ID = 0x{ID:X8}");sb.AppendLine($"DLC = {DLC}");sb.AppendLine($"TIMESTAMP = {TIMESTAMP} us");
​sb.Append("DATA = ");if (DATA != null){for (int i = 0; i < DLC && i < DATA.Length; i++){sb.Append($"{DATA[i]:X2} ");}}else{sb.Append("null");}
​return sb.ToString().TrimEnd();}}
​

Gycylm.Tools.Devices.Cans.Zlg 该库只针对ZLG USBCAN进行了封装,其中还有其他库实现了Vector、PCAN、GCAN...等常见CAN的封装适配。

笔者对CAN通信上位机开发略有经验,欢迎交流。

整理不易,如有需要,联系 mefdeamon@qq.com 获取

结束


积跬步以至千里:) (:一阵没来由的风

http://www.dtcms.com/a/334692.html

相关文章:

  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(2):11-20语法
  • 【星闪】Hi2821 | SysTick系统定时器
  • 《Python学习之字典(二):高级操作与实战技巧》
  • Python训练Day45
  • 无痕HOOK 检测及对抗
  • 嵌入式硬件篇---BuckBoost电路
  • Windows 命令行:ping 命令
  • 中级统计师-会计学基础知识-第三章 会计凭证与会计账簿
  • 福彩双色球第2025094期篮球号码分析
  • PAMI-2025《Fair Clustering Ensemble With Equal Cluster Capacity》
  • 【完整源码+数据集+部署教程】高尔夫球追踪与识别系统源码和数据集:改进yolo11-LAWDS
  • 026 inode 与软硬链接
  • [Oracle数据库] Oracle 复杂查询
  • 8.15 JS流程控制案例+解答
  • java 面试八股集锦
  • K8S HPA 弹性水平扩缩容 Pod 详解
  • 西门子SMART PLC监控时间戳问题BUG修复
  • Cursor执行命令卡顿解决办法(Cursor卡住、Cursor命令卡住、Cursor执行慢、Cursor执行命令慢)改成以管理员身份运行就好!!!
  • 《探索IndexedDB实现浏览器端UTXO模型的前沿技术》
  • 【CPP】自己实现一个CPP小工具demo,可以扩展其他选项
  • homebrew 2
  • pytorch例子计算两张图相似度
  • 创建maven module中的override
  • Maven下载和配置-IDEA使用
  • 自动化测试的下一站:AI缺陷检测工具如何实现“bug提前预警”?
  • uniapp跨端适配方案
  • Qt 动态属性(Dynamic Property)详解
  • SDN安全开发环境中常见的框架,工具,第三方库,mininet常见指令介绍
  • 【基础-判断】HarmonyOS提供了基础的应用加固安全能力,包括混淆、加密和代码签名能力
  • 守护品质安全,防伪溯源系统打造全链路信任体系