C# WPF 读写CAN数据
C# WPF 读写CAN数据
CAN 分析仪
分析仪资料下载
官方地址:https://www.zhcxgd.com/1.html
CSDN:
项目配置
复制Dll库文件
文件在上面的资料里面
设置不安全代码
CAN C#工具类
CAN_Tool.cs
using Microsoft.VisualBasic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;namespace CAN_TEST.tool
{/*------------兼容ZLG的数据类型---------------------------------*///1.ZLGCAN系列接口卡信息的数据类型。//public struct VCI_BOARD_INFO //{ // public UInt16 hw_Version;// public UInt16 fw_Version;// public UInt16 dr_Version;// public UInt16 in_Version;// public UInt16 irq_Num;// public byte can_Num;// [MarshalAs(UnmanagedType.ByValArray, SizeConst=20)] public byte []str_Serial_Num;// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]// public byte[] str_hw_Type;// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]// public byte[] Reserved;//}//以下为简易定义与调用方式,在项目属性->生成->勾选使用不安全代码即可unsafe public struct VCI_BOARD_INFO//使用不安全代码{public UInt16 hw_Version;public UInt16 fw_Version;public UInt16 dr_Version;public UInt16 in_Version;public UInt16 irq_Num;public byte can_Num;public fixed byte str_Serial_Num[20];public fixed byte str_hw_Type[40];public fixed byte Reserved[8];}///2.定义CAN信息帧的数据类型。unsafe public struct VCI_CAN_OBJ //使用不安全代码{public uint ID;public uint TimeStamp; //时间标识public byte TimeFlag; //是否使用时间标识public byte SendType; //发送标志。保留,未用public byte RemoteFlag; //是否是远程帧public byte ExternFlag; //是否是扩展帧public byte DataLen; //数据长度public fixed byte Data[8]; //数据public fixed byte Reserved[3];//保留位}//3.定义初始化CAN的数据类型public struct VCI_INIT_CONFIG{public UInt32 AccCode;public UInt32 AccMask;public UInt32 Reserved;public byte Filter; //0或1接收所有帧。2标准帧滤波,3是扩展帧滤波。public byte Timing0; //波特率参数,具体配置,请查看二次开发库函数说明书。public byte Timing1;public byte Mode; //模式,0表示正常模式,1表示只听模式,2自测模式}/*------------其他数据结构描述---------------------------------*///4.USB-CAN总线适配器板卡信息的数据类型1,该类型为VCI_FindUsbDevice函数的返回参数。public struct VCI_BOARD_INFO1{public UInt16 hw_Version;public UInt16 fw_Version;public UInt16 dr_Version;public UInt16 in_Version;public UInt16 irq_Num;public byte can_Num;public byte Reserved;[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] str_Serial_Num;[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]public byte[] str_hw_Type;[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]public byte[] str_Usb_Serial;}/*------------数据结构描述完成---------------------------------*/public struct CHGDESIPANDPORT{[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]public byte[] szpwd;[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]public byte[] szdesip;public Int32 desport;public void Init(){szpwd = new byte[10];szdesip = new byte[20];}}public class CAN_Tool{const int DEV_USBCAN = 3;const int DEV_USBCAN2 = 4;/// <summary>/// /// </summary>/// <param name="DeviceType"></param>/// <param name="DeviceInd"></param>/// <param name="Reserved"></param>/// <returns></returns>/*------------兼容ZLG的函数描述---------------------------------*//*------------兼容ZLG的函数描述---------------------------------*/[DllImport("controlcan.dll")]public static extern UInt32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved);[DllImport("controlcan.dll")]public static extern UInt32 VCI_CloseDevice(UInt32 DeviceType, UInt32 DeviceInd);[DllImport("controlcan.dll")]public static extern UInt32 VCI_InitCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_INIT_CONFIG pInitConfig);[DllImport("controlcan.dll")]public static extern UInt32 VCI_ReadBoardInfo(UInt32 DeviceType, UInt32 DeviceInd, ref VCI_BOARD_INFO pInfo);[DllImport("controlcan.dll")]public static extern UInt32 VCI_GetReceiveNum(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);[DllImport("controlcan.dll")]public static extern UInt32 VCI_ClearBuffer(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);[DllImport("controlcan.dll")]public static extern UInt32 VCI_StartCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);[DllImport("controlcan.dll")]public static extern UInt32 VCI_ResetCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);[DllImport("controlcan.dll")]public static extern UInt32 VCI_Transmit(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pSend, UInt32 Len);[DllImport("controlcan.dll")]public static extern UInt32 VCI_Receive(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pReceive, UInt32 Len, Int32 WaitTime);/*------------其他函数描述---------------------------------*/[DllImport("controlcan.dll")]public static extern UInt32 VCI_ConnectDevice(UInt32 DevType, UInt32 DevIndex);[DllImport("controlcan.dll")]public static extern UInt32 VCI_UsbDeviceReset(UInt32 DevType, UInt32 DevIndex, UInt32 Reserved);[DllImport("controlcan.dll")]public static extern UInt32 VCI_FindUsbDevice2(ref VCI_BOARD_INFO pInfo);/*------------函数描述结束---------------------------------*/static UInt32 m_bOpen = 0;static UInt32 m_devind = 0;static UInt32 m_canind = 0;static UInt32[] m_arrdevtype = new UInt32[20];static VCI_CAN_OBJ[] m_recobj = new VCI_CAN_OBJ[1000];static UInt32 m_devtype = 4;//USBCAN2//this.timer_rec = new System.Windows.Forms.Timer(this.components);public static void init(){m_arrdevtype[2] = 3;m_arrdevtype[3] = 4;}public static void close_CAN(){CAN_Tool.VCI_CloseDevice(m_devtype, m_devind);m_bOpen = 0;}public static void start_CAN(){if (m_bOpen == 0)return;CAN_Tool.VCI_StartCAN(m_devtype, m_devind, m_canind);}unsafe public static string can_send(string can_data_idText,string can_send_data){if (m_bOpen == 0){MessageBox.Show("CAN断开连接", "错误");return null;}VCI_CAN_OBJ sendobj = new VCI_CAN_OBJ();//sendobj.Init();sendobj.RemoteFlag = (byte)0;sendobj.ExternFlag = (byte)0;sendobj.ID = System.Convert.ToUInt32("0x" + can_data_idText, 16);int len = (can_send_data.Length + 1) / 3;sendobj.DataLen = System.Convert.ToByte(len);String strdata = can_send_data;//MessageBox.Show(strdata);int i = -1;if (i++ < len - 1)sendobj.Data[0] = System.Convert.ToByte("0x" + strdata.Substring(i * 3, 2), 16);if (i++ < len - 1)sendobj.Data[1] = System.Convert.ToByte("0x" + strdata.Substring(i * 3, 2), 16);if (i++ < len - 1)sendobj.Data[2] = System.Convert.ToByte("0x" + strdata.Substring(i * 3, 2), 16);if (i++ < len - 1)sendobj.Data[3] = System.Convert.ToByte("0x" + strdata.Substring(i * 3, 2), 16);if (i++ < len - 1)sendobj.Data[4] = System.Convert.ToByte("0x" + strdata.Substring(i * 3, 2), 16);if (i++ < len - 1)sendobj.Data[5] = System.Convert.ToByte("0x" + strdata.Substring(i * 3, 2), 16);if (i++ < len - 1)sendobj.Data[6] = System.Convert.ToByte("0x" + strdata.Substring(i * 3, 2), 16);if (i++ < len - 1)sendobj.Data[7] = System.Convert.ToByte("0x" + strdata.Substring(i * 3, 2), 16);if (CAN_Tool.VCI_Transmit(m_devtype, m_devind, m_canind, ref sendobj, 1) == 0){MessageBox.Show("发送失败", "错误");return null;}else{return "TX 帧ID:" + can_data_idText + " 数据: " + can_send_data;}}public static string connect_CAN(int CAN_Type, int CAN_id,int RUN_mod){//以下两行为多卡同机测试代码,用来获取序列号与对应的设备索引号,单卡可以不使用。VCI_BOARD_INFO[] vbi2 = new VCI_BOARD_INFO[50];uint num1 = CAN_Tool.VCI_FindUsbDevice2(ref vbi2[0]);m_devtype = m_arrdevtype[CAN_Type + 2];m_devind = 0;m_canind = (UInt32)CAN_id;if (CAN_Tool.VCI_OpenDevice(m_devtype, m_devind, 0) == 0){MessageBox.Show("打开设备失败,请检查设备类型和设备索引号是否正确", "错误");m_bOpen = 0;return "";}m_bOpen = 1;VCI_INIT_CONFIG config = new VCI_INIT_CONFIG();config.AccCode = System.Convert.ToUInt32("0x" + "00000000", 16);config.AccMask = System.Convert.ToUInt32("0x" + "FFFFFFFF", 16);config.Timing0 = System.Convert.ToByte("0x" + "00", 16);config.Timing1 = System.Convert.ToByte("0x" + "1C", 16);config.Filter = (Byte)(0 + 1);config.Mode = (Byte)RUN_mod;CAN_Tool.VCI_InitCAN(m_devtype, m_devind, m_canind, ref config);return m_bOpen == 0 ? "断开" : "连接";}unsafe public static string TimerRecTick(){UInt32 res = new UInt32();res = CAN_Tool.VCI_Receive(m_devtype, m_devind, m_canind, ref m_recobj[0], 1000, 100);///IntPtr[] ptArray = new IntPtr[1];//ptArray[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VCI_CAN_OBJ)) * 50);//IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)) * 1);//Marshal.Copy(ptArray, 0, pt, 1);//MessageBox.Show(res+"");//res = VCI_Receive(m_devtype, m_devind, m_canind, pt, 50/*50*/, 100);if (res == 0xFFFFFFFF) res = 0;//当设备未初始化时,返回0xFFFFFFFF,不进行列表显示。String str = "";for (UInt32 i = 0; i < res; i++){//VCI_CAN_OBJ obj = (VCI_CAN_OBJ)Marshal.PtrToStructure((IntPtr)((UInt32)pt + i * Marshal.SizeOf(typeof(VCI_CAN_OBJ))), typeof(VCI_CAN_OBJ));str = "RX: ";str += " 帧ID:0x" + System.Convert.ToString(m_recobj[i].ID, 16);str += " 帧格式:";if (m_recobj[i].RemoteFlag == 0)str += "数据帧 ";elsestr += "远程帧 ";if (m_recobj[i].ExternFlag == 0)str += "标准帧 ";elsestr += "扩展帧 ";//if (m_recobj[i].RemoteFlag == 0){str += "数据: ";byte len = (byte)(m_recobj[i].DataLen % 9);byte j = 0;fixed (VCI_CAN_OBJ* m_recobj1 = &m_recobj[i]){if (j++ < len)str += " " + System.Convert.ToString(m_recobj1->Data[0], 16);if (j++ < len)str += " " + System.Convert.ToString(m_recobj1->Data[1], 16);if (j++ < len)str += " " + System.Convert.ToString(m_recobj1->Data[2], 16);if (j++ < len)str += " " + System.Convert.ToString(m_recobj1->Data[3], 16);if (j++ < len)str += " " + System.Convert.ToString(m_recobj1->Data[4], 16);if (j++ < len)str += " " + System.Convert.ToString(m_recobj1->Data[5], 16);if (j++ < len)str += " " + System.Convert.ToString(m_recobj1->Data[6], 16);if (j++ < len)str += " " + System.Convert.ToString(m_recobj1->Data[7], 16);}}return str + "\n";}return null;}}
}
主界面
MainWindow.xaml
<Window x:Class="CAN_TEST.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"Title="CAN测试" Height="600" Width="400"><Grid><StackPanel><StackPanel Orientation="Horizontal" Height="30" Margin="0,20,0,0"><Button Margin="10,0,0,0" Click="connect_CAN" Width="100">连接分析仪</Button><Button Margin="20,0,0,0" Click="close_CAN" Width="100">断开分析仪</Button><Button Margin="20,0,0,0" Click="start_CAN" Width="100">启动CAN</Button></StackPanel><StackPanel Orientation="Horizontal" Height="30" Margin="0,20,0,0"><StackPanel Orientation="Horizontal" Margin="20,0,0,0"><TextBlock>CAN类型</TextBlock><ComboBox HorizontalAlignment="Center" Width="100" Margin="20,0,0,0" x:Name="CAN_Type"><ComboBoxItem>USBCAN V1</ComboBoxItem><ComboBoxItem>USBCAN V2</ComboBoxItem></ComboBox></StackPanel><StackPanel Orientation="Horizontal" Margin="20,0,0,0"><TextBlock>CAN通道</TextBlock><ComboBox HorizontalAlignment="Center" Width="100" Margin="20,0,0,0" x:Name="CAN_id"><ComboBoxItem>CAN1</ComboBoxItem><ComboBoxItem>CAN2</ComboBoxItem></ComboBox></StackPanel></StackPanel><StackPanel Orientation="Horizontal" Height="30" Margin="0,20,0,0"><StackPanel Orientation="Horizontal" Margin="20,0,0,0"><TextBlock>CAN运行模式</TextBlock><ComboBox HorizontalAlignment="Center" Width="100" Margin="20,0,0,0" x:Name="RUN_mod"><ComboBoxItem>正常</ComboBoxItem><ComboBoxItem>只听</ComboBoxItem><ComboBoxItem>自测</ComboBoxItem></ComboBox></StackPanel><TextBlock Margin="20,0,0,0">连接状态:</TextBlock><TextBlock Text="断开" x:Name="CAN_statusText"></TextBlock></StackPanel><StackPanel Orientation="Horizontal"><StackPanel Orientation="Vertical" Width="300" Margin="0,10,0,0"><TextBlock TextAlignment="Center">数据发送</TextBlock><StackPanel Orientation="Horizontal" Margin="0,10,0,0"><TextBlock TextAlignment="Center" Margin="20,0,0,0">帧ID:</TextBlock><TextBox Width="200" Margin="33,0,0,0" x:Name="can_data_id" Text="00000123"></TextBox></StackPanel><StackPanel Orientation="Horizontal" Margin="0,10,0,0"><TextBlock TextAlignment="Center" Margin="20,0,0,0">发送数据:</TextBlock><TextBox Width="200" Margin="10,0,0,0" x:Name="can_send_data" Text="00 01 02 03 04 05 06 07 "></TextBox></StackPanel><Button Width="50" Margin="0,10,0,0" Click="can_send">发送</Button></StackPanel></StackPanel><StackPanel Orientation="Horizontal"><TextBlock TextAlignment="Center">数据接收</TextBlock></StackPanel><StackPanel Orientation="Horizontal"><TextBox Width="350" Height="200" Margin="10,0,0,0" VerticalScrollBarVisibility="Visible" MaxLines="5" x:Name="resData" TextWrapping="Wrap"></TextBox></StackPanel></StackPanel></Grid>
</Window>
MainWindow.xaml.cs
using CAN_TEST.tool;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Configuration;
using System.Runtime.InteropServices;
using System.Text;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
using static CAN_TEST.MainWindow;namespace HZFM_TEST
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{DispatcherTimer m_timer = new DispatcherTimer();public MainWindow(){InitializeComponent();// 初始化CANCAN_Tool.init();// 启动定时器m_timer.Interval = TimeSpan.FromSeconds(0.2);m_timer.Tick += new System.EventHandler(timer_rec_Tick);}private void close_CAN(object sender, RoutedEventArgs e){// 关闭CANCAN_Tool.close_CAN();}private void start_CAN(object sender, RoutedEventArgs e){// 启动CANCAN_Tool.start_CAN();}private void connect_CAN(object sender, RoutedEventArgs e){ // 连接CAN分析仪string outData = CAN_Tool.connect_CAN(CAN_Type.SelectedIndex, CAN_id.SelectedIndex, RUN_mod.SelectedIndex);if(outData.Length > 0){m_timer.Start();}CAN_statusText.Text = outData;}// 定时收数据任务unsafe private void timer_rec_Tick(object sender, EventArgs e){string res = CAN_Tool.TimerRecTick();if(res != null){resData.AppendText(res + "\r\n");}}// 发送惨数据unsafe private void can_send(object sender, RoutedEventArgs e){string res = CAN_Tool.can_send(can_data_id.Text, can_send_data.Text);if (res != null){resData.AppendText(res + "\r\n");}}// 读取数据private void read_Data(object sender, RoutedEventArgs e){Button btn = sender as Button;int id = int.Parse(btn.CommandParameter.ToString()) + 1;string res = CAN_Tool.can_send("01800300", can_send_data.Text);if (res != null){resData.AppendText(res + "\r\n");}}}
}
相关文章:

C# WPF 读写CAN数据
C# WPF 读写CAN数据 CAN 分析仪 分析仪资料下载 官方地址:https://www.zhcxgd.com/1.html CSDN: 项目配置 复制Dll库文件 文件在上面的资料里面 设置不安全代码 CAN C#工具类 CAN_Tool.cs using Microsoft.VisualBasic; using System; using Sys…...
力扣2517.礼盒的最大甜蜜度
力扣2517.礼盒的最大甜蜜度 二分答案求最小值 排完序判断是否有k个差距至少为mid的元素别用i遍历 可能会越界 用 : 有多少取多少 class Solution {public:int maximumTastiness(vector<int>& price, int k) {ranges::sort(price);auto check [&](int mid) -&…...

多模块存储器
随着计算机技术的发展,处理的信息量越来越多,对存储器的速度和容量要求也越来越高;而且随着CPU性能的不断提高、IO设备数量不断增加,导致主存的存取速度已经称为了整个计算机系统的性能瓶颈。这就要求我们必须提高主存的访问速度。…...

Windows反截屏开发实现
文章目录 Windows反截屏开发实现1. SetWindowDisplayAffinity2. 反截屏系统3. 总结 Windows反截屏开发实现 最近在我们云桌面中需要做到反截屏能力,所谓反截屏就是我们无法通过截图软件(微信,QQ,截图等程序)截取桌面的…...
Android.mk的用法
前言 Android.mk 文件是 Android 编译系统中用于描述项目源文件、库和模块的 Makefile。它采用 GNU Make 的语法,但也包含了一些特定于 Android 编译系统的规则和变量。以下是对其语法和使用方法的详细解释及示例。 一:模块种类 一个Android.mk file用来向编译系统描述你的源…...

android studio CreateProcess error=2, 系统找不到指定的文件
【问题记录篇】 在AndroidStudio编译开发jni相关工程代码的时候,编译遇到的这个报错: CreateProcess error2, 系统找不到指定的文件。排查处理步骤: 先查看Build Output的具体日志输出 2.了解到问题出在了NDK配置上,此时需要根据自己的gra…...
jQuery如何把单选框设置为选中状态
在网页开发中,我们经常需要使用表单元素来收集用户数据。其中,单选框(radio button)是一种常见的表单元素,用于从一组选项中选择一个。使用jQuery,我们可以轻松地控制这些单选框的状态,包括将它…...

Mware Fusion Pro 13 mac版:一键掌控虚拟世界
VMware Fusion Pro 13是一款功能卓越的虚拟化软件,专为Mac操作系统量身打造。这款软件为用户提供了一个一站式的虚拟化解决方案,能够满足各种多样化的需求。 VMware Fusion Pro 13 Mac获取 VMware Fusion Pro 13的强大之处在于其采用了最 先进的虚拟化…...

PTA - 函数的定义与调用
编写一个名为collatz()的函数,它有一个名为number的参数: 如果number是偶数,那么collatz()就打印number加上2如果number是奇数,那么collatz()就打印number乘以2 函数接口定义: def collatz(number)裁判测试程序样例: /* 请在这里填写答案…...

Solr7.4.0报错org.apache.solr.common.SolrException
文章目录 org.apache.solr.common.SolrException: Exception writing document id MATERIAL-99598435990497269125316 to the index; possible analysis error: cannot change DocValues type from NUMERIC to SORTED_NUMERIC for field "opt_time"Exception writing…...

从2-3-4树开始理解红黑二叉树(JAVA代码手撸版)
经典的红黑二叉树在新增/删除数据时维持自平衡始终对应着一个2-3-4 树。本文只关注2-3-4 对应的经典红黑二叉树。 暂时不考虑 2-3 树对应的左倾红黑二叉树。 背景知识 2-3-4 树简介 一棵 2-3-4 树的结点分为 内部结点 (internal nodes) 和 叶子结点 (leaf nodes) ,…...
模板类与继承
1模板类继承普通类(常见) #include<iostream> using namespace std; class AA { public:int m_a;AA(int a) :m_a(a) { cout << "调用了AA的构造函数\n"; }void func1() { cout << "调用func1()…...

随手记:uniapp图片展示,剩余的堆叠
UI效果图: 实现思路: 循环图片数组,只展示几张宽度就为几张图片边距的宽度,剩下的图片直接堆叠展示 点击预览的时候传入当前的下标,如果是点击堆叠的话,下标从堆叠数量开始计算 <template><…...
微服务迁移、重构最佳经验
1. 了解现有的单体应用: - 应用架构和技术栈 要了解现有的应用架构和技术栈,可以采取以下几个步骤: 1. 了解应用的背景和目标:首先要了解应用的背景和目标,包括应用所属的行业、应用的类型(例如Web应用、移动应用等…...

【Python】从0开始的Django基础
Django框架基础 unit01一、Django基础1.1 什么是Django?1.2 安装与卸载1.2.1 Python与Django的版本1.2.2 安装1.2.3 查看Django版本1.2.4 卸载 二、Django项目2.1 概述2.2 创建项目2.3 启动项目2.4 项目的目录结构2.5 配置 三、URL 调度器3.2 定义URL路由3.2 定义首页的路由3.…...

红黑树(数据结构篇)
数据结构之红黑树 红黑树(RB-tree) 概念: 红黑树是AVL树的变种,它是每一个节点或者着成红色,或者着成黑色的一棵二叉查找树。对红黑树的操作在最坏情形下花费O(logN)时间,它的插入操作使用的是非递归形式实现红黑树的高度最多是…...
高级视频编码器性能对比(H265、VP9、AV1)
1、背景介绍 目前在视频编解码器中,H264已经成为绝对的主流,被大部分设备、浏览器所支持。虽然有更先进的编码器推出,但是受限于推广速度和设备支持成本,一直未能成为主流。 今年公司目标是持续降本增效,现在将”屠刀…...

示例:WPF中DataGrid简单设置合并列头
一、目的:应用DataGridTemplateColumn列模板,去拆分列头和单元格布局的方式设置列头合并样式 二、实现 效果如下 三、环境 VS2022 四、示例 应用DataGridTemplateColumn自定义列头信息和单元格信息 <DataGrid AutoGenerateColumns"False"…...

Matlab图像处理——细胞图像的分割和计数显示
一. 项目介绍 使用MATLAB编写的细胞图像分割及计数系统,实现了对图像内细胞的计数,以及对每个细胞周长和面积的测量,并分别展示了分割后的每个细胞的图像。实验步骤共分为图像预处理、图像预分割、空洞填充、黏连细胞分割、细胞个数统计、细胞…...
六爻排盘神机
选修课留了3000字的论文......确实,削微有那么一点小困难…… 但是,倘若我拿出已经占了6419个字符的 “六爻排盘神机” ,阁下…应该…不会…骂我吧 且看,六爻排盘神机! import random import datetime from lunarcale…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...