調用.net DLL讓CANoe自動識別串口號

1.前言

CANoe9.0用CAPL控制數控電源_canoe讀取程控電源電流值-CSDN博客

之前做CAPL通過串口控制數控電源,存在一個缺點:更換電腦需要改串口號

CSDN上有類似的博客,不過要收費,本文根據VID和PID來自動獲取串口號,代碼少,使用起來更方便

本文可以告訴大家

(1)C#中如何根據VID和PID來獲取串口號

(2)CAPL如何調用C#的DLL

(3)如何獲取設備的VID和PID

(4)如何創建C#的DLL

2.開發環境

2.1硬件環境

科睿源 KA3005P

2.2軟件環境

Win10 + CANoe12.0 + VS2013

3.參考資料

CANoe Help文檔

4.自動識別串口原理

4.1方案一

枚舉所有串口,分別詢問每個串口是否是指定設備,優點是通用,缺點是速度慢

4.2方案二

根據設備的VID和PID獲取串口號,優點是速度快,缺點是只適合USB轉串口,如果存在多個同類設備,仍然需要每個詢問

由于KA3005P是USB接口的虛擬串口,因此我這里選擇方案二

5.創建C# DLL

5.1 注意事項

5.2 創建DLL工程

5.3 代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.IO.Ports;
using UCANHelper;namespace SerialPortAutoDetect
{public class SerialPortAutoDetect{public static int GetAllPorts(int[] ports, int maxLength){var port_names = SerialPort.GetPortNames();int i = 0;for (i = 0; i < ports.Length && i < maxLength; i++){string num = port_names[i].Replace("COM", "");ports[i] = Convert.ToInt32(num);}return i;}public static int GetPortsByVidPid(int[] ports, int maxLength, ushort vid, ushort pid){List<string> names = USB_Help.ComPortNames(vid.ToString("X4"), pid.ToString("X4"));int i = 0;for (i = 0; i < names.Count && i < maxLength; i++){string num = names[i].Replace("COM", "");ports[i] = Convert.ToInt32(num);}return i;}}
}

USB_Help.cs

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;namespace UCANHelper
{class USB_Help{#region 根據VID PID通過注冊表獲取端口號public static List<string> ComPortNames(String VID, String PID){//https://cloud.tencent.com/developer/ask/sof/115144954RegistryKey rk1 = Registry.LocalMachine;RegistryKey rk2 = rk1.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum");String pattern = String.Format("^VID_{0}.PID_{1}", VID, PID);Regex _rx = new Regex(pattern, RegexOptions.IgnoreCase);List<string> ports = new List<string>();string[] pc_com_ports = SerialPort.GetPortNames();foreach (String s3 in rk2.GetSubKeyNames()){RegistryKey rk3 = rk2.OpenSubKey(s3);foreach (String s in rk3.GetSubKeyNames()){if (_rx.Match(s).Success){RegistryKey rk4 = rk3.OpenSubKey(s);foreach (String s2 in rk4.GetSubKeyNames()){RegistryKey rk5 = rk4.OpenSubKey(s2);RegistryKey rk6 = rk5.OpenSubKey("Device Parameters");string port_name = (string)rk6.GetValue("PortName");if (port_name != null && pc_com_ports.Contains<string>(port_name)){ports.Add(port_name);}}}}}return ports;}#endregion}
}

編譯,生成SerialPortAutoDetect.dll

6.獲取設備的VID和PID

在設備管理器中,找到端口,右擊屬性

7.CAPL中訪問

僅有初始化部分,其他的參考之前的博客

includes
{#pragma netlibrary("..\DLL\SerialPortAutoDetect.dll")
}variables
{// GLOBALconst int kBUFFER_SIZE = 1000;const int kINFO        = 1;const int kWARN        = 2;const int kERROR       = 3;const int kHANDSHAKE_DISABLED = 0;const int kHANDSHAKE_RTSCTS   = 33;// define for dp serial port com9dword port = 6;const dword baudrate = 9600;const dword dataBits = 8;const dword stopBits = 1;const dword parity = 0;//0:none 1:even 0:odd// data is copied from callback buffer to gReceiverBuffer (collects data)byte gReceiverCallbackBuffer[kBUFFER_SIZE];byte gReceivedBuffer[kBUFFER_SIZE];dword gReceivedIndex= 0;// state variablebyte gSending = 0;byte gGetValueSt = 0;byte gSetValueSt = 0;msTimer t100ms;msTimer t20ms;dword vid = 0x0416;dword pid = 0x5011;
}on preStart
{InitSerialPort();  
}on start
{setTimer(t100ms,100);
}
//RS232 Init
InitSerialPort()
{long ports[10];long count=0;count=SerialPortAutoDetect::SerialPortAutoDetect::GetPortsByVidPid(ports,10,vid,pid);if(count > 0){port=ports[0];writeLineEx(0,kINFO,"Find %d serial port, use first serial port: %d.", count, port);}else{writeLineEx(0,kINFO,"Can not find any serial port, use default serial port %d.", port);}    // close serial port (port may have changed, former port shall not remain open)if(Rs232Close(port)!=1)writeLineEx(0,kERROR,"An error occurred during closing of the serial port %d.", port);    // set state (close aborts all open requests)gSending = 0;// open the serial port (comes up with Windows defaults)if(Rs232Open(port)==1)writeLineEx(0,kINFO, "Serial port %d successfully opened.", port);    elsewriteLineEx(0,kERROR,"An error occurred during opening of the serial port %d.", port);    // configure the serial port// - just take the panel contentif(Rs232Configure(port,baudrate,dataBits,stopBits,parity)==1)writeLineEx(0,kINFO, "Serial port %d successfully initialized.", port);    elsewriteLineEx(0,kERROR,"An error occurred during initialization of the serial port %d.", port);    // port, handshake, xonLim, xoffLim, xonChar, xoffChar, writeTimeout// without last timeout parameter: use default timeout// for transmission of small amounts of data one may not need to use handshake ! // e.g. 33 for RTS/CTS as second parameter for large volumes of data, 0 for small volumesif(Rs232SetHandshake(port, kHANDSHAKE_DISABLED, 0, 0, 0, 0))writeLineEx(0,kINFO, "Handshake parameters for serial port %d successfully configured.", port);    elsewriteLineEx(0,kERROR,"An error occurred during the serial port %d configuration of handshake parameters.", port);// set buffer for reception (otherwise callback would not work)if(Rs232Receive(port, gReceiverCallbackBuffer, kBUFFER_SIZE))writeLineEx(0,kINFO, "Receiver buffer for serial port %d successfully set.", port);    elsewriteLineEx(0,kERROR,"An error occurred during setting the receiver buffer for serial port %d.", port);
}

8.測試

可以正確識別到串口3

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84102.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84102.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84102.shtml

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

相關文章

SpringBoot十二、SpringBoot系列web篇之過濾器Filte詳解

一、前言 JavaWeb三大組件Servlet、Filter、Listener&#xff0c;其中之一便是過濾器Filter。 其實&#xff0c;Filter我們平常用的不多&#xff0c;一般多為項目初期搭建web架構的時候使用&#xff0c;后面用的就少了&#xff0c;在日常業務開發中不太可能碰到需要手寫Filte…

Java實現飛機射擊游戲:從設計到完整源代碼

JAVA打飛機游戲畢業設計 一、游戲概述 本游戲基于Java Swing開發&#xff0c;實現了經典的飛機射擊游戲。玩家控制一架戰斗機在屏幕底部移動&#xff0c;發射子彈擊落敵機&#xff0c;同時躲避敵機攻擊。游戲包含多個關卡&#xff0c;隨著關卡提升&#xff0c;敵機速度和數量…

通俗易懂linux環境變量

如果想要清楚的了解環境變量&#xff0c;我覺得我們需要先大致搞清楚一個簡單的事——什么是會話&#xff1f; 會話大致是什么&#xff1f; 在這里我們的目的是更好的理解環境變量&#xff0c;所以適當講解一下會話即可。通常我們都是用xshell連接遠程服務器&#xff0c;都會打…

【補題】Codeforces Round 715 (Div. 2) C. The Sports Festival

題意&#xff1a;給你一個序列&#xff0c;你可以對它重新排序&#xff0c;然后使每個i&#xff0c;max(a0,a1……ai)-min(a0,a1……ai)最小。問答案是多少 思路&#xff1a; C. The Sports Festival&#xff08;區間DP&#xff09;-CSDN博客 區間dp&#xff0c;完全沒想到…

ubuntu系統文件誤刪(/lib/x86_64-linux-gnu/libc.so.6)修復方案 [成功解決]

報錯信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重啟后報錯信息&…

SIFT算法詳細原理與應用

SIFT算法詳細原理與應用 1 SIFT算法由來 1.1 什么是 SIFT&#xff1f; SIFT&#xff0c;全稱為 Scale-Invariant Feature Transform&#xff08;尺度不變特征變換&#xff09;&#xff0c;是一種用于圖像特征檢測和描述的經典算法。它通過提取圖像中的局部關鍵點&#xff0c;…

NPOI操作EXCEL文件 ——CAD C# 二次開發

缺點:dll.版本容易加載錯誤。CAD加載插件時&#xff0c;沒有加載所有類庫。插件運行過程中用到某個類庫&#xff0c;會從CAD的安裝目錄找&#xff0c;找不到就報錯了。 【方案2】讓CAD在加載過程中把類庫加載到內存 【方案3】是發現缺少了哪個庫&#xff0c;就用插件程序加載進…

Go字符串切片操作詳解:str1[:index]

在Go語言中&#xff0c;return str1[:index] 是一個??字符串切片操作??&#xff0c;它截取字符串的一部分。讓我們深入解析這個操作的含義和原理&#xff1a; 基本語法和含義 str1&#xff1a;原始字符串[:index]&#xff1a;切片操作符str1[:index]&#xff1a; ??起始…

NVIDIA Dynamo:數據中心規模的分布式推理服務框架深度解析

NVIDIA Dynamo&#xff1a;數據中心規模的分布式推理服務框架深度解析 摘要 NVIDIA Dynamo是一個革命性的高吞吐量、低延遲推理框架&#xff0c;專為在多節點分布式環境中服務生成式AI和推理模型而設計。本文將深入分析Dynamo的架構設計、核心特性、代碼實現以及實際應用示例&…

408第一季 - 數據結構 - 棧與隊列的應用

括號匹配 用瞪眼法就可以知道的東西 棧在表達式求值運用 先簡單看看就行&#xff0c;題目做了就理解了 AB是操作符,也是被狠狠加入后綴表達式了&#xff0c;然后后面就是*&#xff0c;只要優先級比棧頂運算符牛逼就放里面&#xff0c;很顯然&#xff0c;*比牛逼 繼續前進&#…

Ubuntu 下開機自動執行命令的方法

Ubuntu 下開機自動執行命令的方法&#xff08;使用 crontab&#xff09; 在日常使用 Ubuntu 或其他 Linux 系統時&#xff0c;我們常常需要讓某些程序或腳本在系統啟動后自動運行。例如&#xff1a;啟動 Clash 代理、初始化服務、定時同步數據等。 本文將介紹一種簡單且常用的…

jpackage 打包 jar包 為exe可執行程序

jpackage --input target/ --main-jar note.jar --runtime-image H:/Dpanbeifeng/apps/finalshell/jre --type app-image --dest output/ --main-class com.textmanager.Main --icon logo2.png --name 貓咪快筆記 jpackage 打包指令詳細介紹 jpackage 概述 jpackage 是…

H5移動端性能優化策略(渲染優化+弱網優化+WebView優化)

一、渲染優化&#xff1a;首屏速度提升的核心?? ??1. 關鍵頁面采用SSR或Native渲染?? ??適用場景??&#xff1a;首頁、列表頁、詳情頁等強內容展示頁面 ??優化原理??&#xff1a; ??SSR&#xff08;服務端渲染&#xff09;??&#xff1a;在服務端生成完整…

Matlab | matlab中的圖像處理詳解

MATLAB 圖像處理詳解 這里寫目錄標題圖像處理 MATLAB 圖像處理詳解一、圖像基礎操作1. 圖像讀寫與顯示2. 圖像信息獲取3. 圖像類型轉換二、圖像增強技術1. 對比度調整2. 去噪處理3. 銳化處理三、圖像變換1. 幾何變換2. 頻域變換四、圖像分割1. 閾值分割2. 邊緣檢測3. 區域分割五…

keysight是德科技N9923A網絡分析儀

keysight是德科技N9923A網絡分析儀 簡  述&#xff1a;N9923A 是一款使用電池供電的便攜式射頻矢量網絡分析儀&#xff0c;其中包括全 2 端口網絡分析儀、電纜和天線測試儀、故障點距離測試儀、功率計以及 1 通道和 2 通道矢量電壓表。 主要特性與技術指標 網絡分析儀 * 2…

idea不識別lombok---實體類報沒有getter方法

介紹 本篇文章&#xff0c;主要講idea引入lombok后&#xff0c;在實體類中加注解Data&#xff0c;在項目啟動的時候&#xff0c;編譯不通過&#xff0c;報錯xxx.java沒有getXxxx&#xff08;&#xff09;方法。 原因有以下幾種 1. idea沒有開啟lombok插件 2. 使用idea-2023…

本地主機部署開源企業云盤Seafile并實現外部訪問

Seafile是一個開源、專業、可靠的云存儲平臺&#xff1b;解決文件集中存儲、共享和跨平臺訪問等問題。這款軟件功能強大&#xff0c;界面簡潔、操作方便。 本文將詳細的介紹如何利用本地主機部署 Seafile&#xff0c;并結合nat123&#xff0c;實現外網訪問本地部署的 Seafile …

【從0-1的CSS】第1篇:CSS簡介,選擇器以及常用樣式

文章目錄 CSS簡介CSS的語法規則選擇器id選擇器元素選擇器類選擇器選擇器優先級 CSS注釋 CSS常用設置樣式顏色顏色名稱(常用)RGB(常用)RGBA(常用)HEX(常用)HSLHSLA 背景background-colorbackground-imagebackground-size 字體text-aligntext-decorationtext-indentline-height 邊…

SpringBoot+MySQL家政服務平臺 設計開發

概述 基于SpringBootMySQL開發的家政服務平臺完整項目&#xff0c;該系統實現了用戶預約、服務管理、訂單統計等核心功能&#xff0c;采用主流技術棧開發&#xff0c;代碼規范且易于二次開發。 主要內容 系統功能架構 本系統采用前后端分離架構&#xff0c;前端提供用戶交互…

3.1 HarmonyOS NEXT分布式數據管理實戰:跨設備同步、端云協同與安全保護

HarmonyOS NEXT分布式數據管理實戰&#xff1a;跨設備同步、端云協同與安全保護 在萬物互聯的時代&#xff0c;數據的跨設備流轉與安全共享是全場景應用的核心需求。HarmonyOS NEXT通過分布式數據管理技術&#xff0c;實現了設備間數據的實時同步與端云協同&#xff0c;為開發…