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

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 分析仪 分析仪资料下载 官方地址&#xff1a;https://www.zhcxgd.com/1.html CSDN&#xff1a; 项目配置 复制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) -&…...

多模块存储器

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

Windows反截屏开发实现

文章目录 Windows反截屏开发实现1. SetWindowDisplayAffinity2. 反截屏系统3. 总结 Windows反截屏开发实现 最近在我们云桌面中需要做到反截屏能力&#xff0c;所谓反截屏就是我们无法通过截图软件&#xff08;微信&#xff0c;QQ&#xff0c;截图等程序&#xff09;截取桌面的…...

Android.mk的用法

前言 Android.mk 文件是 Android 编译系统中用于描述项目源文件、库和模块的 Makefile。它采用 GNU Make 的语法,但也包含了一些特定于 Android 编译系统的规则和变量。以下是对其语法和使用方法的详细解释及示例。 一:模块种类 一个Android.mk file用来向编译系统描述你的源…...

android studio CreateProcess error=2, 系统找不到指定的文件

【问题记录篇】 在AndroidStudio编译开发jni相关工程代码的时候&#xff0c;编译遇到的这个报错&#xff1a; CreateProcess error2, 系统找不到指定的文件。排查处理步骤: 先查看Build Output的具体日志输出 2.了解到问题出在了NDK配置上&#xff0c;此时需要根据自己的gra…...

jQuery如何把单选框设置为选中状态

在网页开发中&#xff0c;我们经常需要使用表单元素来收集用户数据。其中&#xff0c;单选框&#xff08;radio button&#xff09;是一种常见的表单元素&#xff0c;用于从一组选项中选择一个。使用jQuery&#xff0c;我们可以轻松地控制这些单选框的状态&#xff0c;包括将它…...

Mware Fusion Pro 13 mac版:一键掌控虚拟世界

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

PTA - 函数的定义与调用

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

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) &#xff0c;…...

模板类与继承

1模板类继承普通类&#xff08;常见&#xff09; #include<iostream> using namespace std; class AA { public:int m_a;AA(int a) :m_a(a) { cout << "调用了AA的构造函数\n"; }void func1() { cout << "调用func1&#xff08;&#xff09;…...

随手记:uniapp图片展示,剩余的堆叠

UI效果图&#xff1a; 实现思路&#xff1a; 循环图片数组&#xff0c;只展示几张宽度就为几张图片边距的宽度&#xff0c;剩下的图片直接堆叠展示 点击预览的时候传入当前的下标&#xff0c;如果是点击堆叠的话&#xff0c;下标从堆叠数量开始计算 <template><…...

微服务迁移、重构最佳经验

1. 了解现有的单体应用: - 应用架构和技术栈 要了解现有的应用架构和技术栈&#xff0c;可以采取以下几个步骤&#xff1a; 1. 了解应用的背景和目标&#xff1a;首先要了解应用的背景和目标&#xff0c;包括应用所属的行业、应用的类型&#xff08;例如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) 概念&#xff1a; 红黑树是AVL树的变种&#xff0c;它是每一个节点或者着成红色&#xff0c;或者着成黑色的一棵二叉查找树。对红黑树的操作在最坏情形下花费O(logN)时间&#xff0c;它的插入操作使用的是非递归形式实现红黑树的高度最多是…...

高级视频编码器性能对比(H265、VP9、AV1)

1、背景介绍 目前在视频编解码器中&#xff0c;H264已经成为绝对的主流&#xff0c;被大部分设备、浏览器所支持。虽然有更先进的编码器推出&#xff0c;但是受限于推广速度和设备支持成本&#xff0c;一直未能成为主流。 今年公司目标是持续降本增效&#xff0c;现在将”屠刀…...

示例:WPF中DataGrid简单设置合并列头

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

Matlab图像处理——细胞图像的分割和计数显示

一. 项目介绍 使用MATLAB编写的细胞图像分割及计数系统&#xff0c;实现了对图像内细胞的计数&#xff0c;以及对每个细胞周长和面积的测量&#xff0c;并分别展示了分割后的每个细胞的图像。实验步骤共分为图像预处理、图像预分割、空洞填充、黏连细胞分割、细胞个数统计、细胞…...

六爻排盘神机

选修课留了3000字的论文......确实&#xff0c;削微有那么一点小困难…… 但是&#xff0c;倘若我拿出已经占了6419个字符的 “六爻排盘神机” &#xff0c;阁下…应该…不会…骂我吧 且看&#xff0c;六爻排盘神机&#xff01; import random import datetime from lunarcale…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

边缘计算网关提升水产养殖尾水处理的远程运维效率

一、项目背景 随着水产养殖行业的快速发展&#xff0c;养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下&#xff0c;而且难以实现精准监控和管理。为了提升尾水处理的效果和效率&#xff0c;同时降低人力成本&#xff0c;某大型水产养殖企业决定…...

PydanticAI快速入门示例

参考链接&#xff1a;https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...