拒絕造輪子(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.pswp.cn/pingmian/93334.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93334.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93334.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習相關算法:回溯算法 貪心算法 回歸算法(線性回歸) 算法超參數 多項式時間 樸素貝葉斯分類算法

整理了一張“機器學習相關算法與概念速覽表”&#xff0c;既包含定義&#xff0c;也配上了容易記住的例子&#xff0c;讓大家一眼就能抓住它們的特點&#xff1a; &#x1f916; 機器學習與相關算法&概念 名稱定義生動例子典型應用場景回溯算法通過不斷嘗試和回退來尋找問…

vue+微信小程序 五角星

說明&#xff1a;這個是先畫出一個72度菱形&#xff0c;長中長線和短中長線按照一定比例&#xff0c;然后把菱形分層十份&#xff0c;最后再把菱形進行旋轉形成五角星&#xff0c;最后顯示標簽&#xff0c;因為一直對不上所以對標簽做了點操作 <template><view class&…

Prometheus + Grafana 深度玩法:從零到智能化監控體系

0. 寫在前面&#xff1a;為什么你需要“神器”而非“常用命令老楊折騰監控系統可是有年頭了&#xff0c;最早還用過 Cacti、Zabbix&#xff0c;那會兒做個儀表盤都得像雕花一樣慢慢刻。后來 Prometheus 出來之后&#xff0c;我的第一反應是&#xff1a;這玩意兒的時間序列和標簽…

YOLO、DarkNet和深度學習如何讓自動駕駛看得清?

【導讀】 本文提出 DarkNet-YOLO 工業級實踐框架&#xff0c;通過引入 殘差優化結構 與 多尺度特征融合技術&#xff0c;在保持實時檢測精度同時顯著提升復雜場景適應性。 目錄 一、目標檢測的進化之路&#xff1a;從“兩步走”到“一眼定乾坤” YOLO的核心思想&#xff1a…

使用 HTML5 Canvas 打造炫酷的數字時鐘動畫

在 Web 開發中&#xff0c;HTML5 的 canvas 元素為我們帶來了強大的繪圖能力&#xff0c;結合 JavaScript&#xff0c;可以實現各種酷炫的效果。今天&#xff0c;我們將深入剖析一段經典的 彩色數字時鐘動畫 代碼&#xff0c;并理解它是如何通過物理模擬實現數字切換時的炫酷粒…

XCZU6CG-2FFVC900I Xilinx FPGA AMD ZynqUltraScale+ MPSoC

XCZU6CG-2FFVC900I Xilinx FPGA&#xff08; AMD&#xff09;Zynq UltraScale MPSoC 。在處理系統&#xff08;PS&#xff09;方面&#xff0c;XCZU6CG 系列通常集成了 ARM Cortex-A53 應用核與 Cortex-R5 實時核的組合&#xff08;典型為 A53 多核 R5 雙核組合&#xff09;&…

Navicat 詢問 AI | 優化 SQL 查詢

近期&#xff0c;我們發布了 Navicat 17.3 版本。這一版本實現了全方位升級&#xff0c;包括對 AI 功能大升級、支持達夢、金倉、瀚高、支持阿里通義千問等 AI 大模型&#xff0c;支持凝思 OS 以及多項 UI 改進。今天&#xff0c;我們將深入介紹 Navicat AI 功能之“詢問 AI ”…

4.6 Vue 3 中的模板引用 (Template Refs)

在 Vue 3 中&#xff0c;ref 是一個核心的響應式 API&#xff0c;但它在模板中還有另一個非常重要的用途&#xff1a;獲取對 DOM 元素或子組件實例的直接引用。這就是我們所說的“模板引用”。核心概念目的&#xff1a;讓你在父組件中能夠直接訪問并操作特定的 DOM 元素或子組件…

模式匹配自動機全面理論分析

模式匹配是什么 模式匹配是計算機科學中一個基礎且重要的問題&#xff0c;廣泛應用于文本編輯、信息檢索、網絡安全、生物信息學等多個領域。簡單來說&#xff0c;模式匹配就是在一個主文本中查找一個或多個特定模式串的出現位置。隨著計算機處理能力的提升和數據規模的擴大&am…

AI 搜索時代:引領變革,重塑您的 SEO 戰略

隨著谷歌轉向人工智能驅動的答案&#xff0c;使用以關鍵字和反向鏈接為中心的過時和傳統的 SEO 策略不再起到任何作用。 由于 Google AI Overviews 和零點擊搜索的興起&#xff0c;自然點擊量正在下降&#xff0c;用戶無需點擊任何網站即可直接在 Google 的搜索結果頁面上獲得答…

【網站深入seo方法】

目錄 ①對于更成熟的網站&#xff0c;簡單的index.html的入口文件的seo已經無法滿足&#xff0c;需要在商品詳情不同商品被搜索時賦予不同的title和description。 ②通過設置站點所有頁面都新增Canonical標簽&#xff0c;指定規范鏈接地址給谷歌并規避聯盟的重復內容頁面。 ③…

ROS move_base 混合功能導航 RealSense D435i + 3D 點云地圖 + 樓層切換 + 路徑錄制 + 路徑規劃

Mixed-Navigation 這個博客也是記錄我們的一個開源項目&#xff0c;其作用是混合功能導航。由于現有的 Fast-Lio-Localization 只實現了定位功能&#xff0c;但對于路徑規劃和樓層切換沒有具體實現&#xff0c;因此我們開出了這個倉庫作為參考。該倉庫的核心功能如下&#xff…

初識c語言————宏定義和調用

目錄&#xff1a;一.不帶參數的宏二.帶參數宏一.不帶參數的宏不帶參數的宏是指用#define指令定義的簡單文本替換規則&#xff0c;它沒有參數列表&#xff0c;直接替換標識符為相應的文本其一般形式為&#xff1a;#define 宏名 文本例如&#xff1a;#define pi 3.14這個代…

數據結構:滿二叉樹 (Full Binary Tree) 和 完全二叉樹 (Complete Binary Tree)

目錄 重要的術語澄清 完美二叉樹 (Perfect Binary Tree) 完全二叉樹 (Complete Binary Tree) 大比拼 (Comparison) 相互關系的第一性推導 我們來深入探討兩種在算法中非常重要的、具有特定“形狀”的二叉樹&#xff1a;滿二叉樹 (Full Binary Tree) 和 完全二叉樹 (Compl…

OpenJDK 17的C1和C2編譯器實現中,方法返回前插入安全點(Safepoint Poll)的機制

OpenJDK 17 JIT編譯器堆棧分析-CSDN博客 在OpenJDK 17的C1和C2編譯器實現中&#xff0c;方法返回前插入安全點&#xff08;Safepoint Poll&#xff09;的機制主要涉及以下關鍵步驟&#xff0c;結合源代碼進行分析&#xff1a; 1. 安全點輪詢樁&#xff08;Safepoint Poll Stu…

【論文筆記】STORYWRITER: A Multi-Agent Framework for Long Story Generation

論文信息 論文標題&#xff1a;StoryWriter: A Multi-Agent Framework for Long Story Generation 論文作者&#xff1a;Haotian Xia, Hao Peng et al. (Tsinghua University) 論文鏈接&#xff1a;https://arxiv.org/abs/2506.16445 代碼鏈接&#xff1a;https://github.com/…

Cohere 開發企業級大型語言模型(LLM)

Cohere 是一家專注于開發企業級大型語言模型&#xff08;LLM&#xff09;的公司。該公司推出了一系列名為 “Command” 的模型&#xff0c;其中最強大的 “Command A” 于今年三月首次亮相 Cohere 還提供嵌入模型&#xff0c;這是一種將文件轉化為神經網絡可以理解的緊湊數值形…

Rust Web框架Axum學習指南之入門初體驗

一、準備階段 確保已經安裝 rust&#xff0c;開發環境使用 vscode 或者 rustrover 都可以。接著就可以創建項目&#xff0c;通過編輯器創建或者命令行創建都可以&#xff1a; cargo new axum-admin二、添加依賴 添加依賴如下&#xff1a; [package] name "axum-admin&quo…

autofit.js: 自動調整HTML元素大小的JavaScript庫

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

RocketMQ 命名服務器(NameServer)詳解

&#x1f680; RocketMQ 命名服務器&#xff08;NameServer&#xff09;詳解 NameServer 是 RocketMQ 架構中的輕量級路由發現服務&#xff0c;它不參與消息的收發&#xff0c;但承擔著整個集群的“地址簿”和“導航系統”的關鍵角色。 理解 NameServer 的設計與工作原理&#…