C# WPF 读写CAN数据

news2025/1/15 20:42:47

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 += "数据帧 ";
                else
                    str += "远程帧 ";
                if (m_recobj[i].ExternFlag == 0)
                    str += "标准帧 ";
                else
                    str += "扩展帧 ";

                //
                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();
			
            // 初始化CAN
            CAN_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)
        {
            // 关闭CAN
            CAN_Tool.close_CAN();
        }

        private void start_CAN(object sender, RoutedEventArgs e)
        {
            // 启动CAN
            CAN_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");
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1816923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ASM-MehotdVisitor实践

使用ASM几乎用户全部的精力都是对MethodVisitor的处理&#xff0c;方法code的处理都需要使用这个类进行操作。还是之前文章说过的&#xff0c;ASM单独学习意义并不大&#xff0c;难以达到触类旁通&#xff0c;先行掌握字节码基础后再玩起ASM才能体会真正的乐趣&#xff0c;不然…

【Python】已解决TypeError: unsupported operand type(s) for ...报错方案合集

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

【Python】selenium 点击某个按钮 click() 出现的报错问题--ElementClickInterceptedException(全!)

写在前面&#xff1a; 我们在使用selenium 点击某个元素时或者获取find_element的某个网页元素时&#xff0c;总会遇到一些问题。本人经验是&#xff0c;最直接的方法是用try_except 报错&#xff0c;直接绕过问题&#xff0c;可以直接看第一条。如果有兴趣具体解决&#xff0c…

让你事半功倍的高效管理微信方法

随着私域运营的需求不断增长&#xff0c;对于使用微信进行运营的企业或个人来说&#xff0c;高效的管理微信变得越发重要&#xff0c;今天分享一些高效管理微信的实用方法&#xff1a;

图像的混合与渐进变换

1.实验目的 平常我们看到的美图秀秀等两个图片混合是怎么生成的呢&#xff0c;今天我们看看图像处理关于这部分怎么做的&#xff1f; 2.实验条件 pycharm python编译器 3.实验代码 # File: 图像混合与渐进变换.py # Author: chen_song # Time: 2024/6/11 下午6:08 "…

Java--三种初始化内存及内存分析

1.静态初始化&#xff1a;创建赋值 int[] a{1,2,3}; Man[] mans{new Man(1,1),new Man(2,2)}; 2.动态初始化&#xff1a;开辟新的存储空间 int[] anew int[2]; a[0]1; a[1]2; 3.默认初始化&#xff1a;数组是引用类型&#xff0c;他的元素相当于类的实例变量&#xff0c;因…

C++ 14 之 宏函数

c14宏函数.cpp #include <iostream> using namespace std;// #define PI 3.14 // 宏函数 // 宏函数缺陷1: 必须用括号保证运算的完整性 #define MY_ADD(x,y) ((x)(y))// 宏函数缺陷2&#xff1a;即使加了括号&#xff0c;有些运算依然与预期不符 #define MY_COM(a,b) ((…

调用腾讯智能云实现人脸融合

目录 1. 作者介绍2. 人脸识别内容介绍2.1 人脸识别简介2.2 技术原理 3. 实现流程及代码实现3.1 实现流程3.2 代码实现3.2.1 图片为url格式3.2.2 图片为base64格式 3.3 完整代码3.4 问题分析 1. 作者介绍 杨煜星&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c…

TextCtrl输入文本类

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 wx.StaticText类只能够用于显示纯粹的静态文本&#xff0c;但是有时需要输入文本与用户进行交互&#xff0c;此时&#xff0c;就需要使用wx.TextCtrl…

简单项目——前后端分离实现博客系统

文章目录 一、项目实现的准备工作二、数据库的设计以及构建三、封装数据库连接、创建实体类四、封装数据库的增删查改操作五、实现博客系统核心操作1.获取博客列表页2.获取博客详情页3. 实现博客登录页4. 实现所有页面检查并强制登录5.退出登录状态6. 实现博客发布7. 实现删除文…

线上观看人次2万+!「飞天技术沙龙-CentOS 迁移替换专场」北京站圆满结束

5 月 29 日&#xff0c;阿里云联合龙蜥社区共同举办的「飞天技术沙龙-CentOS 迁移替换专场」于北京圆满结束&#xff0c;在线观看人次 2 万。本次活动现场汇聚了来自浪潮信息、Intel、龙芯、统信软件、红旗软件、电子五所等多家操作系统产业头部企业和机构&#xff0c;大家围绕…

零基础非科班也能掌握的C语言知识21 编译链接(介于作者实力有限并且没有可以演示的过程软件仅仅浅谈)

编译链接 1.翻译环境和运行环境2.翻译环境2.1 编译2.1.1 预处理&#xff08;预编译&#xff09;2.1.2 编译2.1.3 汇编 2.2 链接 3.运行环境 1.翻译环境和运行环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 编译环境运行环境 2.翻译环境 翻译环境由编译和…

极氪汽车交出上市首份答卷:业绩交付“双开花”,新车型质量保优

近日&#xff0c;极氪汽车&#xff08;NYSE&#xff1a;ZK&#xff0c;下同“极氪”&#xff09;发布2024年第一季度财报&#xff0c;这也是该公司自5月20日登陆美股以来对外披露的首份业绩报告。 极氪汽车是继“蔚小理”之后第四家在美国上市的新能源车企&#xff0c;发布至今…

图形学初识--定义摄像机类(实战)

文章目录 前言正文定义摄像机的操作方式键盘操作鼠标操作 定义摄像机类核心数据视图矩阵回顾&#xff1a;模拟摄像机的移动模拟摄像机的旋转 结尾&#xff1a;喜欢的小伙伴点点关注赞哦! 前言 前面一些章节讲解了图形学的比较原理性的内容&#xff0c;这一章节咱就实战一下&am…

监控登录用户数

检查登录用户数 当登录系统用户数超过3个报警&#xff0c;并发送邮件提示 首先&#xff0c;配置发送邮件功能。 1、安装mailx [rootnode1 ~]# yum install mailx2、配置/etc/mail.rc [rootnode1 ~]# vim /etc/mail.rc set fromxxx163.com #发件人地址 set smtpsmtp.163…

深层网络:层数多真的更好吗?

深层网络&#xff1a;层数多真的更好吗&#xff1f; 在深度学习的世界里&#xff0c;"深度"始终是一个热门话题。随着技术的发展&#xff0c;我们有了越来越多的方法来构建更深的神经网络&#xff0c;这似乎暗示着“层数越多&#xff0c;效果越好”。然而&#xff0…

通用大模型与垂直大模型:双轨并进的人工智能未来

在人工智能(AI)的浩瀚宇宙中&#xff0c;大模型以其强大的学习能力和广泛的适用性&#xff0c;正逐步成为推动技术进步和产业革新的核心动力。在这股浪潮中&#xff0c;通用大模型与垂直大模型如同两颗璀璨的星辰&#xff0c;各自散发着独特的光芒&#xff0c;共同照亮了AI发展…

哪个品牌洗地机专业?四款明星精湛产品集结

当代快节奏的生活&#xff0c;人们每天下班回到家只想瘫倒在沙发&#xff0c;打扫卫生成为了一种负担......但洗地机的出现&#xff0c;大大的减轻了人们地板清洁的焦虑&#xff0c;因为它只需轻轻地推拉机子转悠房屋一圈&#xff0c;地面上的赃污便能清理干净&#xff0c;清洁…

如何优化大屏网站的响应式设计?技巧一览

为了显示不同屏幕尺寸设备的显示效果&#xff0c;有必要优先考虑响应设计&#xff0c;因为开发人员可以在不同的设备中构建应用程序。响应设计是一种灵活的设计&#xff0c;可以兼顾多屏幕和多场景&#xff0c;可以使我们的网页布局在各种屏幕下呈现出更好的效果。今天&#xf…

“JS加密在线”:简单直接的在线JS加密网站

网站名&#xff1a;“JS加密在线”&#xff0c; 功能&#xff1a;JavaScript源代码加密。 UI&#xff1a; http://jsjiami.online/ 非常简洁的JS加密网站&#xff0c;几乎只有两个功能&#xff1a;上传JS文件、下载加密后的JS文件。 JS加密&#xff0c;就应该这样简单直接。…