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

MFC串口通信(SerialPort)

目录

1、SerialPort类的介绍和使用:

(1)、SerialPort类的功能介绍

(2)、SerialPort类提供接口函数的介绍

1)、InitPort函数

2)、控制串口监视线程函数

3)、获取事件,写缓冲大小,获取DCB的接口函数

4)、写数据到串口接口函数

5)、错误处理接口函数

6)、线程接口函数

7)、接收字符和字符串接口函数

8)、对接手的数据进行处理函数

(3)、对于这些接口函数的使用

2、设计串口通信:

(1)、UI设计

(2)、添加变量

(3)、程序设计

1)、初始化下拉框

2)、打开串口点击事件

3)、发送信息点击事件

4)、发送清空显示功能实现

5)、勾选框功能的添加

6)、保存文件功能实现

7)、实现饮水机的读取温度功能


1、SerialPort类的介绍和使用:

(1)、SerialPort类的功能介绍

SerialPort类封装了串口的基本上操作,包括打开串口,传递串口参数,控制串口监视线程,获取写缓冲事件,获取事件,获取DCB,写数据到串口,从串口读数据,判断串口是否打开,关闭串口,线程处理等功能

(2)、SerialPort类提供接口函数的介绍

1)、InitPort函数

串口连接首先要打开串口建立串口通讯协议(也就是确定串口号,波特率,数据位,校验位和停止位)。InitPort函数实现的就是串口的打开和串口设置的初始化。

函数原型:

BOOL        InitPort(HWND pPortOwner, UINT portnr = 1, UINT baud = 9600,
            TCHAR parity = _T('N'), UINT databits = 8, UINT stopsbits = ONESTOPBIT,
            DWORD dwCommEvents = EV_RXCHAR | EV_CTS, UINT nBufferSize = 512,

            DWORD ReadIntervalTimeout = 1000,
            DWORD ReadTotalTimeoutMultiplier = 1000,
            DWORD ReadTotalTimeoutConstant = 1000,
            DWORD WriteTotalTimeoutMultiplier = 1000,
            DWORD WriteTotalTimeoutConstant = 1000);

BOOL CSerialPort::InitPort(HWND pPortOwner,    // 接收消息的当前对话框(默认只有一个句柄)
    UINT  portnr,        // portnumber (串口号,可以有1-100个串口号,这里数字不代表串口号)
    UINT  baud,            // baudrate(波特率,数据每秒传输的位数,波特率大不代表准确)
    TCHAR  parity,        // parity (校验位,用于错误检查的一种数据,通常与数据位和停止位一起传输表示一个完整的数据块)
    UINT  databits,        // databits (二进制位,用于表示传输的原始数据)
    UINT  stopbits,        // stopbits (数据传输结束后发送的最后一位数,通常位1或者0)
    DWORD dwCommEvents,    // EV_RXCHAR(有字符可读取), EV_CTS etc(清除发送),这俩标志位按照按位与和或可以检测多种事件。(串口通信时需要监测的事件类型)
    UINT  writebuffersize,// size to the writebuffern(表示缓冲区的大小,不能太小,防止数据丢失)

    DWORD   ReadIntervalTimeout,(DWORD4个字节的无符号整数)
    DWORD   ReadTotalTimeoutMultiplier,
    DWORD   ReadTotalTimeoutConstant,(上面三个DWORD值代表读操作的超时时间)
    DWORD   WriteTotalTimeoutMultiplier,
    DWORD   WriteTotalTimeoutConstant)(上面俩个DWORD值代表写操作的超时时间)

2)、控制串口监视线程函数


        BOOL         StartMonitoring();//开始监听
        BOOL         ResumeMonitoring();//恢复监听
        BOOL         SuspendMonitoring();//挂起监听
        BOOL         IsThreadSuspend(HANDLE hThread);//判断线程是否挂起 //add by itas109 2016-06-29

3)、获取事件,写缓冲大小,获取DCB的接口函数

        DWORD         GetWriteBufferSize();///获取写缓冲大小
        DWORD         GetCommEvents();///获取事件
        DCB             GetDCB();///获取DCB

4)、写数据到串口接口函数

        void        WriteToPort(char* string, size_t n); //重载写字符串(二进制)
        void        WriteToPort(PBYTE Buffer, size_t n);// 重载写16进制
        void        ClosePort();              //关闭串口
        BOOL        IsOpened();          //判断串口是否打开

5)、错误处理接口函数

void        ProcessErrorMessage(TCHAR* ErrorText);///错误处理

6)、线程接口函数

static DWORD WINAPI CommThread(LPVOID pParam);///线程函数

LPVOID相当于是一个VOID,传递一个VOID类型的指针,在线程中不断的读取串口数据

7)、接收字符和字符串接口函数

static void ReceiveStr(CSerialPort* port); //接收单个字符。

WriteChar(CSerialPort* port);//接收字符串(\0结尾)。

8)、对接手的数据进行处理函数

virtual int HandleReadData(uint8_t *pMsgBuf, uint32_t iSize) = 0;// 对接收到的数据进行响应处理

(重写纯虚函数来实现数据处理)

(3)、对于这些接口函数的使用

由于SerialPort以及封装好了底层操作,首先InItPort函数(也就是传递串口设置和对话框的句柄),其次就可以进行写入串口操作WriteToPort和数据处理重写纯虚函数HandleReadData。

2、设计串口通信:

(1)、UI设计

创建工程,选择MFC对话框,然后添加控件

(2)、添加变量

(3)、程序设计

1)、初始化下拉框

在框架类的CPP中,自定义函数MycommInit来初始化下拉列表

在OnInitDialog中被调用初始化。这个初始化仅仅是一个UI上的初始化。

2)、打开串口点击事件

打开串口的点击事件,首先需要根据SerialPort的打开串口接口函数进行串口属性的初始化(真正的属性初始化)和打开串口操作,同时设置了一个picture control(更改属性加载BTM的图片)根据串口打开和关闭改变颜色。

先判断什么时候需要进行串口的初始化

    UpdateData(TRUE); 

//将控件中的内容同步到变量中,我们操作控件就相当于操作变量。

    CString strOpen;

//strOpen来获得按钮上面的文字内容。
    GetDlgItemText(IDC_BUTTON_OPEN, strOpen);  

     if (strOpen == "打开串口")

//点击按钮事件,点击的是打开串口
    {

        进行一些操作

    }

波特率

/*增加波特率的代码复用性*/
            const TCHAR* buffer1 = m_strbaut.GetBuffer(); 

// 获取 CString 对象内部字符数组的指针
            UINT m_mystrbaut = _ttoi(buffer1);

 // 使用 _ttoi() 或其他适当的转换函数将字符串转换为 UINT 类型
            m_strbaut.ReleaseBuffer(); 

// 释放 CString 对象的缓冲区

串口号

/*增加串口号的代码复用性*/
            const TCHAR* buffer2 = m_strcomm.GetBuffer(); 

// 获取 CString 对象内部字符数组的指针
            int index = m_strcomm.FindOneOf(_T("0123456789")); 

// 查找第一个数字字符的索引
            CString numericPart = m_strcomm.Mid(index); 

// 提取从第一个数字字符开始的子字符串
            unsigned long ulValue = _tcstoul(numericPart, nullptr, 10); 

// 将提取的子字符串转换为 unsigned long 类型
            UINT m_mystrcomm = static_cast<UINT>(ulValue); 

// 将 unsigned long 类型的值转换为 UINT 类型
            m_strcomm.ReleaseBuffer();

// 释放 CString 对象的缓冲区

// 现在,m_mystrcomm 变量中存储了转换后的 UINT 数值

校验位

 /*增加校验位的代码复用性*/
            CString strcheck = getCheck();
            const TCHAR* buffer = strcheck.GetBuffer();

// 获取 CString 对象内部字符数组的指针
            TCHAR m_mycbcheck = buffer[0];

// 获取第一个字符
            strcheck.ReleaseBuffer();

// 释放 CString 对象的缓冲区

停止位

/*/*增加停止位的代码复用性*/
            const TCHAR* buffer3 = m_strstop.GetBuffer();

// 获取 CString 对象内部字符数组的指针
            UINT m_mystrstop = _ttoi(buffer3);

// 使用 _ttoi() 或其他适当的转换函数将字符串转换为 UINT 类型
            if (m_mystrstop == 1)
                m_mystrstop = 0;
            m_strstop.ReleaseBuffer();

// 释放 CString 对象的缓冲区

真正打开串口

//初始化串口
   m_myserialport.InitPort

(

m_hWnd,

m_mystrcomm,

m_mystrbaut,

m_mycbcheck,

8,

m_mystrstop

);
 

m_myserialport.StartMonitoring();//开始监听

异常捕获(上面的打开串口)

try{打开串口操作}

catch (CException* e)
        {
            MessageBox(L"端口不存在!", L"打开串口", MB_ICONERROR);
            return;
        }

加载自己的位图

        CBitmap bitmap;  // CBitmap对象,用于加载位图    
        HBITMAP hBmp;    // 保存CBitmap加载的位图的句柄   

        bitmap.LoadBitmap(IDB_BITMAP_GREEN);  // 将位图IDB_BITMAP1加载到bitmap   
        hBmp = (HBITMAP)bitmap.GetSafeHandle();  // 获取bitmap加载位图的句柄   
        m_PictureContol.SetBitmap(hBmp);    // 设置图片控件m_picIndicator的位图图片为IDB_BITMAP_GREEN 

打开串口操作之后,打开串口变成关闭串口并且位图也要变化

else // 4、此时串口已经处于打开状态 执行关闭串口
    {    
        m_myserialport.SuspendMonitoring();
        m_myserialport.ClosePort();
        

        SetDlgItemText(IDC_BUTTON_OPEN, _T("打开串口")); //串口打开之后,设置按钮为“关闭”

        CBitmap bitmap;  // CBitmap对象,用于加载位图    
        HBITMAP hBmp;    // 保存CBitmap加载的位图的句柄   

        bitmap.LoadBitmap(IDB_BITMAP_RED);  // 将位图IDB_BITMAP1加载到bitmap   
        hBmp = (HBITMAP)bitmap.GetSafeHandle();  // 获取bitmap加载位图的句柄   
        m_PictureContol.SetBitmap(hBmp);    // 设置图片控件m_picIndicator的位图图片为IDB_BITMAP_RED 

    }

    

3)、发送信息点击事件

点击发送按钮在EDIT中发送信息

先进性一个判断如果串口没有打开就提示弹框,获取我们打开串口上面的文字内容进行判断。

CString strOpen;//strOpen来获得按钮上面的文字内容。
GetDlgItemText(IDC_BUTTON_OPEN, strOpen);

if (strOpen =="打开串口")
    {
        MessageBox(L"串口未打开!", L"串口问题", MB_ICONERROR);
        return;
    }

然后就可以进行发送消息的处理(首先是发送二十六进制数据)

首先定义一个BYTE类型的数组存放数据,把EDIT上的内容同步到str上

BYTE *data = new BYTE[m_strReceive.GetLength()];//自定义接收十六进制的数组
                int rlen = 0;
                CString str;
                str = m_strReceive;

自定以一个处理函数来处理数据,先转成十进制再利用十进制转成16进制的整形存放再数组中

    rlen = Str2Hex(str, data);
//自定义函数Str2Hex函数处理,十进制转换成16进制存放在data数组中
int Str2Hex(CString str, BYTE *data)
{
    int t, t1;
    int rlen = 0, len = str.GetLength();
    if (len == 1)
    {
        char h = str[0];
        t = HexChar(h);
        data[0] = (BYTE)t;
        rlen++;
    }
    for (int i = 0; i < len;)
    {
        char l, h = str[i];
        if (h == ' ')
        {
            i++;
            continue;
        }
        i++;
        if (i >= len)
            break;
        l = str[i];
        t = HexChar(h);
        t1 = HexChar(l);
        if ((t == 16) || (t1 == 16))
        break;
        else
        t = t * 16 + t1;
        i++;
        data[rlen] = (BYTE)t;
        rlen++;
    }
    return rlen;
}

rlen = Str2Hex(str, data);

上面的函数需要先调用HexChar把字符数字转成十进制对应的数字

//自定义函数HexChar处理十六进制(十六进制转成10进制)
char HexChar(char c)

{
    if ((c >= '0') && (c <= '9'))

        return c - '0';//16进制中的,字符0-9转化成10进制,还是0-9

    else if ((c >= 'A') && (c <= 'F'))

        return c - 'A' + 10;//16进制中的A-F,分别对应着11-16

    else if ((c >= 'a') && (c <= 'f'))

        return c - 'a' + 10;//16进制中的a-f,分别对应也是11-16,不区分大小写

    else

        return 0x10;   // 其他返回0x10
}

利用WriteToPort函数接口第二个重载可以发送十六进制,直接传递参数

    m_myserialport.WriteToPort(data, rlen);

      delete[]data;
      data = NULL;//释放空间

如果发送的是二进制数据可以直接调用WriteToPort函数

else
            {
                CString cstr;
                cstr = m_strReceive;
                CStringA cstrA;
                cstrA = cstr; //CString类型转成char *类型才能传入参数
                m_myserialport.WriteToPort(cstrA.GetBuffer(), cstr.GetLength());
            }

4)、发送清空显示功能实现

void CMyChillerDlg::OnBnClickedButtonReceiveclear()
{
    // TODO: 在此添加控件通知处理程序代码

    SetDlgItemText(IDC_EDIT1, L" ");
    UpdateData(TRUE);
}

5)、勾选框功能的添加

当选中十六进制发送的时候,把原来EDIT上的文本直接转成十六进制

获取EDIT中的内容然后格式化内容

wchar_t *p = m_strReceive.GetBuffer(m_strReceive.GetLength());
 m_strReceive.ReleaseBuffer();

遍历每一个字符都格式化成16进制

CString str = L"";
        int length = m_strSend.GetLength();

        for (int i = 0; i < length; i++)
        {
            CStringW strTemp;
            strTemp.Format(L"%02X", p[i]);
            str = str + strTemp + L" ";
        }
        m_strSend = str.TrimRight(L" ");

没有勾选勾选框的情况下默认二进制

else    //此时要把十六进制转换成字符格式
    {
        int length = m_strSend.GetLength();
        CString str;
        for (int i = 0; i < length; i += 3)
        {
            CStringW strTemp = m_strSend.Mid(i, 2);
            wchar_t *p = strTemp.GetBuffer(2);
            int num = wcstol(p, NULL, 16);
            strTemp.Format(L"%c", num);
            str = str + strTemp;
        }
        m_strSend = str;
    }

    UpdateData(FALSE);

6)、保存文件功能实现

UpdateData(TRUE);

    TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|所有文件(*.*)|*.*||"); // 设置过滤器  
    CFileDialog fileDlg(FALSE, _T("doc"), _T("InitFileName"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);// 构造保存文件对话框   
    CString strFilePath;

    // 显示保存文件对话框   
    if (IDOK == fileDlg.DoModal())
    {
        strFilePath = fileDlg.GetPathName();
        //MessageBox(strFilePath);   

        CFile file;      // CFile对象
        if (file.Open(strFilePath, CFile::modeCreate | CFile::modeReadWrite))
        {
            TCHAR *p = m_strreceive.GetBuffer(m_strreceive.GetLength());
            file.Write(p, m_strreceive.GetLength());

            file.Close();
        }
    }

7)、打开文件功能实现

m_strSend = L"";

    TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");// 设置过滤器   
    CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);// 构造打开文件对话框   
    CString strFilePath;

    if (IDOK == fileDlg.DoModal())// 显示打开文件对话框  
    {
        strFilePath = fileDlg.GetPathName();   // 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里
                                               //MessageBox(strFilePath);  

        CFile file;      // CFile对象
        char readBuffer[2048];
        if (file.Open(strFilePath, CFile::modeRead))
        {
            int nRet = file.Read(readBuffer, 2048);

            for (int i = 0; i < nRet; i++)
            {
                CString str;
                str.Format(L"%c", readBuffer[i]);
                m_strSend += str;
            }
        }
        UpdateData(FALSE);
    }

7)、实现饮水机的读取温度功能

对话框中的通信类的实例化对象调用通讯类的函数自动发送读取温度的十六进制

UpdateData(TRUE);
    CString strOpen;//strOpen来获得按钮上面的文字内容。
    GetDlgItemText(IDC_BUTTON_OPEN, strOpen);


    if (strOpen == "打开串口")
    {
        MessageBox(L"串口未打开!", L"串口问题", MB_ICONERROR);
        return;
    }
    else
    {
        double temp = 0.0;
        m_myserialport.ReadTemp(temp);//调用读取温度的函数,发送特定的十六进制。
    }

通讯类发送温度ReadTemp函数

m_bReciveFlag = false;

    //发送读取指令
    BYTE buffer[] = {0XFE,0X03,0X00,0X2D,0X00,0X01,0X00,0X0C};
    int lenth = 8;
    WriteToPort(buffer,lenth);
    

    // 等待水冷机返回内容
    int iTimeOut = 5000;   // 5s超时
    while (iTimeOut > 0)
    {
        if (m_bReciveFlag)
        {
            drefTemp = m_dTemp;
            return true;
        }

        iTimeOut -= 50;
        Sleep(50);
    }

通过勾选框十六进制读取温度的勾选来解析收到的十六进制

bool m_bReciveFlag = true;  // 接收到内容标志
    
        
        CString strHex;
        for (uint32_t i = 0; i < iSize; i++)
        {
            CString hexValue;
            hexValue.Format(_T("%02X "), pMsgBuf[i]); // 将每个字节转换为两位十六进制数
            strHex += hexValue;
        }
        
        // 获取第5和第6个字节的十六进制字符串
        // 获取第 4 和第 5 个字节的十六进制字符串
        CString hexSubstring2 = strHex.Mid(9, 5); // 假设第 4 和第 5 个字节对应的十六进制数在字符串中的位置为 6~9

        hexSubstring2.Remove(' ');//去掉空格否则是1遇到空格之间阻断。
        // 将十六进制字符串转换为十进制数
        unsigned long decimalNumber = _tcstoul(hexSubstring2, NULL, 16);
         decimalFloat = static_cast<double>(decimalNumber) / 10.0;
        CString decimalString;
        decimalString.Format(_T("%.1f"), decimalFloat);
        
        // 将十进制数转换为字符串
        // 使用 += 运算符
        decimalString += _T("℃");

        // 将结果输出到EDIT控件上
        // 假设EDIT控件的ID为IDC_EDIT_RESULT
         pEdit = GetDlgItem(IDC_EDIT1);
        if (pEdit != NULL)
        {
            pEdit->SetWindowText(decimalString);
            
        }
        return m_bReciveFlag;

相关文章:

MFC串口通信(SerialPort)

目录 1、SerialPort类的介绍和使用&#xff1a; &#xff08;1&#xff09;、SerialPort类的功能介绍 &#xff08;2&#xff09;、SerialPort类提供接口函数的介绍 1&#xff09;、InitPort函数 2&#xff09;、控制串口监视线程函数 3&#xff09;、获取事件&#xff0c…...

Vim基本使用操作

前言&#xff1a;作者也是初学Linux&#xff0c;可能总结的还不是很到位 Linux修炼功法&#xff1a;初阶功法 ♈️今日夜电波&#xff1a;美人鱼—林俊杰 0:21━━━━━━️&#x1f49f;──────── 4:14 …...

【深蓝学院】手写VIO第8章--相机与IMU时间戳同步--作业

0. 题目 1. T1 逆深度参数化时的特征匀速模型的重投影误差 参考常鑫助教的答案&#xff1a;思路是将i时刻的观测投到world系&#xff0c;再用j时刻pose和外参投到j时刻camera坐标系下&#xff0c;归一化得到预测的二维坐标&#xff08;这里忽略了camera的内参&#xff0c;逆深…...

Naocs配置中心配置映射List、Map、Map嵌套List等方式

一、配置映射List 1、常规逐个配置方式,示例如下: 代码: @Data @Configuration @ConfigurationProperties(prefix = "list-json-str") public class ConfListByJsonStr implements Serializable, InitializingBean {@ApiModelProperty("映射结果集")…...

如何通过CRM系统进行销售机会管理?

销售机会管理是在销售过程中对潜在客户的精细化管理&#xff0c;销售机会管理的本质是公司用于管理销售机会通用的工具和方法。对于希望建立长期客户关系的现代销售团队来说&#xff0c;CRM客户管理系统是必不可少的工具。那企业如何通过CRM系统进行销售机会管理&#xff1f; …...

解决idea启动tomcat控制台中文乱码

#1.tomcat日志中文乱码# 如图这种情况&#xff0c;一般在idea用tomcat跑一个web项目启动后tomcat日志在控制台打印出来会出现中文乱码的情况 解决方案1&#xff1a;tomcat的日志配置文件的编码修改&#xff0c;找到tomcat安装目录conf下的logging.properties&#xff0c;encod…...

vscode + cmake + opencv example

nice try on macos CMakeLists.txt cmake_minimum_required(VERSION 3.20) #添加OPENCV库 #指定OpenCV版本&#xff0c;代码如下 #find_package(OpenCV 3.3 REQUIRED) #如果不需要指定OpenCV版本&#xff0c;代码如下 find_package(OpenCV REQUIRED)#添加OpenCV头文件 includ…...

day57【动态规划】647.回文子串 516.最长回文子序列

文章目录 647. 回文子串516.最长回文子序列 647. 回文子串 力扣题目链接 代码随想录讲解 题意&#xff1a;给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的…...

分享vmware和Oracle VM VirtualBox虚拟机的区别,简述哪一个更适合我?

VMware和Oracle VM VirtualBox虚拟机的区别主要体现在以下几个方面&#xff1a; 首先两种软件的安装使用教程如下&#xff1a; 1&#xff1a;VMware ESXI 安装使用教程 2&#xff1a;Oracle VM VirtualBox安装使用教程 商业模式&#xff1a;VMware是一家商业公司&#xff0c;而…...

YOLOV5模型运行

1安装包 如果已经有了torch-cuda环境直接在环境下 pip install -r requirements.txt 2解决报错代码 raise ImportError("Failed to initialize: {0}".format(exc)) from exc ImportError: Failed to initialize: Bad git executable. The git executable must be …...

@Autowired和@Resource注解的区别和联系

直接看原文 原文链接: 【精选】Autowired和Resource注解的区别和联系【精选】 ------------------------------------------------------------------------------------------------------------------------------- 先说联系 联系 Autowired和Resource注解都是作为bean…...

设计模式类型

创建型模式 创建型模式(Creational Pattern)对类的实例化过程进行了抽象&#xff0c;能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰&#xff0c;外界对于这些对象只需要知道它们共同的接口&#xff0c;而不清楚其具体的实现细节&#xff0c;使整个系…...

Android修行手册-实现利用POI将图片插入到Excel中(文末送书)

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…...

低功耗工业RFID设备应用

随着工业自动化的迅速发展&#xff0c;RFID技术也在工业领域得到了广泛的应用&#xff0c;在近距离非接触读写应用时&#xff0c;常常利用低功耗的工业RFID设备来进行识别&#xff0c;下面我们将详细介绍低功耗工业RFID设备的应用。 低功耗工业RFID设备具有功耗低、体积小、重量…...

# Oracle 库常见问题排查

Oracle 库常见问题排查 文章目录 Oracle 库常见问题排查查询数据库的相关信息查看正在执行的语句杀掉正在执行的sql查看未提交的事务查看锁表 查询数据库的相关信息 查看正在执行的语句 SELECT s.sid, s.serial#, s.username, s.status, s.sql_id, s.sql_child_number, sq.sq…...

矩阵乘积的迹对矩阵求导

说明 有时候为了输入方便&#xff0c;B和都代表B的转置。 矩阵的在线计算有个网站可以参考&#xff1a;Matrix Calculus dtr(AB)/dAB 下面用一个例子来证明。 dtr(ABA)/dAABAB 下面用一个例子来证明&#xff1a; 因为我们要求ABA的迹&#xff0c;所以为了简便&#xff0c;我们…...

IP 地址冲突检测工具

IP 冲突是一个术语&#xff0c;用于表示同一网络或子网中尝试使用相同 IP 地址的两个或多个设备的状态&#xff0c;这可能会导致发往特定主机的通信与其他主机混淆&#xff0c;因为两者都使用相同的 IP&#xff0c;为了避免这种情况&#xff0c;某些主机在发生 IP 冲突时会失去…...

js树形数组遍历练习,扁平化、格式化、获取节点父级

1.树形数组扁平化 数组扁平化的方式很多&#xff0c;这里主要是用递归处理&#xff0c;除此之外还有正则、扩展运算符等等 const list [{name:1,id:1,children:[{name:11,id:11,children:[{name:111,id:111}]},{name:12},]},{name:2,id:2,children:[{name:21,id:21,children:…...

c语言贪吃蛇项目的实现

ncurse的引入 ncurse的概念 ncurse(new curses)是一套编程库&#xff0c;它提供了一系列的函数&#xff0c;以便使用者调用它们去生成基于文本的用户界面。 ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库。ncurses用得最多的地方是…...

IDEA运行前端vue项目,安装nodejs,以及配置

我在刚接手到一个项目的时候&#xff0c;不知道前端的代码的情况下&#xff0c;想要写后端代码&#xff0c;遇到问题 所以需要看前台代码&#xff0c;着手IDEA 开始 安装nodejs (为什么要安装nodejs呢&#xff0c;首先就是说需要npm, 而nodejs 内置npm) 1.从官网下载 nodej…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...