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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于JavaWeb+SpringBoot+微信小程序的酒店商品配送平台系统的设计和实现

基于JavaWebSpringBoot微信小程序的酒店商品配送平台系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 本章内容概括了基于微信小程序的酒店商品配送平台的可行性分析、系统功…

Linux安装Python3.10与部署flask项目实战详细记录

java开发新手入门Python,创建flask后端服务对外提供访问.记录一下在阿里云服务器部署flask项目的操作过程,简单介绍一下使用的阿里云服务器系统配置:ubantu16.04,其他内核版本操作部分命令会有所区别,下面开始详细操作过程! 1.pycharm创建flask项目并打包 2.Python3.…

Apache Storm 2.5.0 单机安装与配置

1、下载storm 2.5.0 2、需要安装python3&#xff0c;并且设置python3的环境变量 3、修改storm.yaml配置 storm.zookeeper.servers:- "node4" # - "server2" # # nimbus.seeds: ["host1", "host2", "host3"] # nimbus…

javaSE学习笔记(五)集合框架-Collection,List,Set,Map,HashMap,Hashtable,ConcurrentHashMap

目录 四、集合框架 1.集合概述 集合的作用 集合和数组的区别 集合继承体系 数组和链表 数组集合 链表集合 2.Collection 方法 集合遍历 并发修改异常 3.List List集合的特有功能&#xff08;核心是索引&#xff09; 集合遍历 并发修改异常产生解决方案ListIterato…

ubuntu下Anaconda环境安装GPU的pytorch(docker镜像)

实验室需要给每个人分配docker的container环境&#xff0c;为了节省系统的空间&#xff0c;打算把anaconda和深度学习的开发环境配置好拉取镜像以省时间。 基础环境配置 apt更新了清华源 安装了基础环境 gcc vim Linux文本编辑库 openssh-server ssh远程连接库 net-tools 包含…

Visual Leak Detector 2.5.1 (VLD)下载、安装与使用

目录 1 软件介绍 2 下载与安装 2.1 工具下载地址 2.2 工具安装 3 配置与使用 3.1 配置环境变量 3.2 配置vs 3.3 VLD的配置 4 测试代码与报告生成 1 软件介绍 Visual Leak Detector 2.5.1 (VLD)是一个小巧内存检测工具&#xff0c;是为Visual C用户设计的。其特色为&a…

基于开源项目OCR做一个探究(chineseocr_lite)

背景&#xff1a;基于图片识别的技术有很多&#xff0c;应用与各行各业&#xff0c;我们公司围绕电子身份证识别自动录入需求开展&#xff0c;以下是我的研究心得 技术栈&#xff1a;python3.6&#xff0c;chineseocr_lite的onnx推理 环境部署&#xff1a;直接上截图&#xff…

ARMday2(环境创建+工程配置+创建文件+单步调试)

目录 一、汇编环境的创建 二、为工程配置链接脚本&#xff08;map.lds&#xff09; 三、为工程创建汇编文件 start.s 编程调试 接下来我们需要建立一个 start.s 汇编文件添加到我们的工程中去 四、对汇编代码进行单步调试&#xff08;仿真&#xff09; 五、汇编工程的编译 …

手握“发展密钥”,TCL科技或迎价值重估?

在高度竞争且快速变化的泛半导体产业&#xff0c;每一次周期性或结构性的变化&#xff0c;都会对企业经营策略带来深远的影响。 2023年前三季度&#xff0c;泛半导体产业迎来结构性复苏。其中&#xff0c;主流显示领域供需关系趋向健康化&#xff0c;半导体显示行业整体上量价…

iOS 16.4 之后真机与模拟器无法使用Safari调试H5页面问题

背景 iOS 16.4之后用真机调试H5时候发现&#xff0c;Safari中开发模块下面无法调试页面 解决方案 在WKWebView中设置以下代码解决 if (available(iOS 16.4, *)) {[_webView setInspectable:YES];}然后再次调试就可以了

redis持久化和Redis事务

一)Redis持久化之RDBredisDataBase: 什么是持久化: 1)持久性:和持久化说的是同一回事&#xff0c;衡量持久性的前提是重启进程或者是重启主机以后数据是否还存在 持久:把数据存储在硬盘上&#xff0c;那么就是持久性 不持久:把数据存储在内存中 2)redis是一个内存级别的数据库&…

一个“Hello, World”Flask应用程序

如果您访问Flask网站&#xff0c;会看到一个非常简单的示例应用程序&#xff0c;只有5行代码。为了不重复那个简单的示例&#xff0c;我将向您展示一个稍微复杂一些的示例&#xff0c;它将为您编写大型应用程序提供一个良好的基础结构。 应用程序将存在于包中。在Python中&…

在 Vue3 中使用 mitt 进行组件通信

npm 包地址 mitt 是一个轻量级的 JavaScript 事件触发器&#xff0c; 只有200b。有基本的事件触发、订阅和取消订阅功能&#xff0c;还支持用命名空间来进行更高级的事件处理。 功能特点&#xff1a; Microscopic —— weighs less than 200 bytes gzippedUseful —— a wil…

抖店怎么做才会快速起店?跟着这个思路来,一周搞定!

大家好&#xff0c;我是电商糖果 有不少朋友&#xff0c;自己开了一家抖店。 因为不懂运营&#xff0c;店铺一直没有流量&#xff0c;也不出单。 糖果做抖店三年多了&#xff0c;不敢自吹有多么优秀&#xff0c;但是做店还是有一套自己的方法的。 按照糖果这个思路做店&…

edge浏览器无法进入中国知网,但可以进入其他网站需要怎么解决

最近使用edge浏览器进入中国知网&#xff0c;加载了很长时间都打不开&#xff0c;好不容易打开了&#xff0c;结果出现&#xff1a;“嗯...无法访问此页面”。即使无法进入知网&#xff0c;但可以进入哔哩哔哩或其他网站&#xff0c;甚是苦恼&#xff0c;下面是一个方法&#x…

Echarts示例

一.概念 ECharts&#xff08;Enterprise Charts&#xff09;是百度开源的一个基于JavaScript的可视化图表库。它提供了多种常见的数据可视化图表&#xff0c;包括折线图、柱状图、散点图、饼图、雷达图等等。使用ECharts&#xff0c;用户可以通过简单的配置和接口调用来创建交…

rabbitmq入门学习

写在前面 本文看下rabbit mq的基础概念以及使用。 1&#xff1a;简单介绍 为了不同进程间通信的解耦&#xff0c;出现了消息队列&#xff0c;为了规范消息队列的具体实现&#xff0c;Java制定了jms规范&#xff0c;这是一套基于接口的规范&#xff0c;因此是绑定语言的&…

人脸识别中的人工智能

随着人工智能技术的快速发展&#xff0c;人脸识别作为其中的一个重要应用领域&#xff0c;已经在各个行业和场景中展现出了巨大的潜力和价值。人脸识别技术通过对人脸图像进行采集、处理和分析&#xff0c;基于人工智能算法对人脸进行识别和验证&#xff0c;并在安防监控、金融…

安防监控EasyCVR视频汇聚平台无法接入Ehome5.0是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放…

彻底删除Ubuntu双系统(联想小新2022)

彻底卸载Ubuntu双系统 以里联想小新pro16 i9-12900h为例子 把开机启动项设为默认Windows启动 以联想电脑为例子&#xff0c;关机后一直点击Fn F2进入Bios把windows启动项移到最上面&#xff0c;这样可以开机默认启动windows了删除ubuntu系统分区 使用磁盘管理软件 DiskGeniu…
最新文章