QT串口和数据库通信

news2024/11/15 10:51:29

创建串口

串口连接客户端并向服务器发送消息

client.pro

#-------------------------------------------------
#
# Project created by QtCreator 2024-07-02T14:11:20
#
#-------------------------------------------------

QT       += core gui network
QT       += core gui serialport

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = client
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
#include <QSerialPort>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    void InitClient();
    void InitWidget();

private slots:
    void on_connect_bt_clicked();
    void OnReadData();
    void OnReadyData1();
    void on_open_bt_clicked();

private:
    Ui::Widget *ui;

    QTcpSocket *m_pSocket;
    QSerialPort *m_pSerial;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.InitClient();
    w.InitWidget();

    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QHostAddress>
#include <QSerialPort>
#include <QSerialPortInfo>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_pSocket = NULL;
    m_pSerial = NULL;
}

Widget::~Widget()
{
    delete ui;
}

void Widget::InitClient()
{
    qDebug() << "Widget::InitClient() enter";
    if (NULL == m_pSocket)
    {
        m_pSocket = new QTcpSocket(this);
        connect(m_pSocket, SIGNAL(readyRead()), this, SLOT(OnReadData()));
    }
    qDebug() << "Widget::InitClient() exit";
}

void Widget::on_connect_bt_clicked()
{
    qDebug() << "Widget::on_connect_bt_clicked() enter";

    QString strIP = ui->ip_edit->text();
    QString strPort = ui->port_edit->text();
    qDebug() << strIP << " " << strPort;
    if (strIP.length() == 0 || strPort.length() == 0)
    {
        qDebug() << "input error";
        return;
    }

    if (NULL == m_pSocket)
    {
        qDebug() << "socket error";
        return;
    }

    m_pSocket->connectToHost(QHostAddress("127.0.0.1"), strPort.toShort());
    if (m_pSocket->waitForConnected(3000))
    {
        qDebug() << "connect ok";
    }
    else
    {
        qDebug() << "connect error";
    }
    qDebug() << "Widget::on_connect_bt_clicked() exit";
}

void Widget::OnReadData()
{
    QByteArray arr = m_pSocket->readAll();
    qDebug() << arr;
}

void Widget::InitWidget()
{
    qDebug()  << "Widget::InitWidget() enter";
    if (NULL  == m_pSerial)
    {
        m_pSerial  = new QSerialPort(this);
        connect(m_pSerial, SIGNAL(readyRead()), this, SLOT(OnReadyData1()));
    }
    qDebug()  << "Widget::InitWidget() exit";
}

void Widget::OnReadyData1() //串口数据就绪槽函数,当串口有数据可读时,该函数会被调用
{
    qDebug()  << "Widget::OnReadyData1() enter";
    QByteArray strData = m_pSerial->readAll(); // 读取所有数据,处理接收到的数据
    m_pSocket->write(strData.toStdString().data());
    qDebug()  << "Widget::OnReadyData1() exit";
}

void Widget::on_open_bt_clicked()
{
    qDebug()  << "Widget::on_open_bt_clicked() enter";
    if (NULL == m_pSerial)
    {
        qDebug()  << "serial obj error";
        return;
    }
    QString strBt = ui->open_bt->text();
    if (strBt == "open")
    {
        QString strCom = ui->uart_com->currentText();
        if (strCom.length() == 0)
        {
            qDebug() << "com port error";
            return;
        }
        m_pSerial->setPortName(strCom);
        m_pSerial->setBaudRate(QSerialPort::Baud9600);
        m_pSerial->setDataBits(QSerialPort::Data8);
        m_pSerial->setStopBits(QSerialPort::OneStop);
        m_pSerial->setParity(QSerialPort::NoParity);
        m_pSerial->setFlowControl(QSerialPort::NoFlowControl);

        if (!m_pSerial->isOpen())
        {
            if (m_pSerial->open(QIODevice::ReadWrite))
            {
                qDebug()  <<  "open ok";
                ui->open_bt->setText("close");
                ui->uart_com->setEnabled(false);
            }
            else
            {
                qDebug()  << "open error";
            }
        }
    }
    else
    {
        m_pSerial->close();
        ui->open_bt->setText("open");
        //ui->send_bt->setEnabled(false);
        ui->uart_com->setEnabled(true);
    }
qDebug()  << "Widget::on_open_bt_clicked() exit";

}




widget.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>692</width>
    <height>468</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
  <widget class="QLabel" name="label">
   <property name="geometry">
    <rect>
     <x>30</x>
     <y>140</y>
     <width>72</width>
     <height>15</height>
    </rect>
   </property>
   <property name="text">
    <string>ip</string>
   </property>
  </widget>
  <widget class="QLineEdit" name="ip_edit">
   <property name="geometry">
    <rect>
     <x>110</x>
     <y>140</y>
     <width>181</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QLabel" name="label_2">
   <property name="geometry">
    <rect>
     <x>30</x>
     <y>180</y>
     <width>72</width>
     <height>15</height>
    </rect>
   </property>
   <property name="text">
    <string>port</string>
   </property>
  </widget>
  <widget class="QLineEdit" name="port_edit">
   <property name="geometry">
    <rect>
     <x>110</x>
     <y>180</y>
     <width>181</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QPushButton" name="connect_bt">
   <property name="geometry">
    <rect>
     <x>340</x>
     <y>150</y>
     <width>93</width>
     <height>28</height>
    </rect>
   </property>
   <property name="text">
    <string>connect</string>
   </property>
  </widget>
  <widget class="QComboBox" name="uart_com">
   <property name="geometry">
    <rect>
     <x>30</x>
     <y>50</y>
     <width>87</width>
     <height>22</height>
    </rect>
   </property>
   <item>
    <property name="text">
     <string>com9</string>
    </property>
   </item>
  </widget>
  <widget class="QPushButton" name="open_bt">
   <property name="geometry">
    <rect>
     <x>200</x>
     <y>50</y>
     <width>93</width>
     <height>28</height>
    </rect>
   </property>
   <property name="text">
    <string>open</string>
   </property>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

服务器接收数据并存储在数据库内 

server.pro

#-------------------------------------------------
#
# Project created by QtCreator 2024-07-02T09:20:48
#
#-------------------------------------------------

QT       += core gui network
QT       += core gui sql

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = server
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += main.cpp\
        widget.cpp \
    db.cpp

HEADERS  += widget.h \
    common.h \
    db.h

FORMS    += widget.ui

common.h

#ifndef _COMMON_H_
#define _COMMON_H_

#include <QDebug>
#include <QTime>

#define _TIME_ qPrintable(QTime::currentTime().toString("hh:mm:ss:zzz"))

#define FUNCTION_ENTER qDebug("%s %s %d %s start!",__FILE__,__FUNCTION__,__LINE__,_TIME_);
#define FUNCTION_EXIT qDebug("%s %s %d %s end!",__FILE__,__FUNCTION__,__LINE__,_TIME_);

#endif //_COMMON_H_

db.h

#ifndef _DB_H_
#define _DB_H_

#include <QSqlDatabase>
#include <QSqlQuery>

class DBManager
{
public:
    enum DBMANAGER_TYPE
    {
        DBMANAGER_OK = 0,
        DBMANAGER_ERR,
    };

public:
    static DBManager * GetInstance();
    static void DestroyInstance();

    int ExecSql(QString strSql);
    int ExecSql(QString strSql, QSqlQuery &query);

private:
    DBManager();
    ~DBManager();

    void InitDb();

private:
    static DBManager *m_pManager;
    QSqlDatabase m_db;
};

#endif //_DB_H_

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    void InitServer();
    void InitWidget();

private slots:
    void OnNewConnection();
    void on_listen_bt_clicked();
    void Insert();
    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
    QTcpServer *m_pServer;
};

#endif // WIDGET_H

db.cpp

#include "common.h"
#include "db.h"
#include <QSqlError>

DBManager *DBManager::m_pManager = NULL;

int DBManager::ExecSql(QString strSql, QSqlQuery &query)
{
    FUNCTION_ENTER;
    if (strSql.length() == 0)
    {
        return DBMANAGER_ERR;
    }
    query = m_db.exec(strSql);
    if (m_db.lastError().isValid())
    {
        qDebug() << m_db.lastError().text();
        return DBMANAGER_ERR;
    }
    FUNCTION_EXIT;
    return DBMANAGER_OK;
}

int DBManager::ExecSql(QString strSql)
{
    FUNCTION_ENTER;
    if (strSql.length() == 0)
    {
        return DBMANAGER_ERR;
    }
    m_db.exec(strSql);
    if (m_db.lastError().isValid())
    {
        qDebug() << m_db.lastError().text();
        return DBMANAGER_ERR;
    }
    FUNCTION_EXIT;
    return DBMANAGER_OK;
}

DBManager::DBManager()
{
    FUNCTION_ENTER;
    FUNCTION_EXIT;
}

DBManager::~DBManager()
{
    FUNCTION_ENTER;
    FUNCTION_EXIT;
}

DBManager *DBManager::GetInstance()
{
    FUNCTION_ENTER;
    if (NULL == m_pManager)
    {
        m_pManager = new DBManager();
        m_pManager->InitDb();
    }
    FUNCTION_EXIT;
    return m_pManager;
}

void DBManager::DestroyInstance()
{
    FUNCTION_ENTER;
    if (NULL != m_pManager)
    {
        delete m_pManager;
        m_pManager = NULL;
    }
    FUNCTION_EXIT;
}

void DBManager::InitDb()
{
    FUNCTION_ENTER;
    m_db = QSqlDatabase::addDatabase("QMYSQL");
    m_db.setHostName("localhost");
    m_db.setDatabaseName("text");
    m_db.setUserName("root");
    m_db.setPassword("123456");

    if (m_db.open())
    {
        qDebug() << "open ok";
    }
    FUNCTION_EXIT;
}




main.cpp

#include "widget.h"
#include <QApplication>
#include <QSqlDatabase> //sql驱动基础
#include <QSqlQuery>//sql查询相关
#include <QSqlError>//sql输出错误

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.InitServer();
    w.InitWidget();
    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QHostAddress>
#include <QTcpSocket>
#include "common.h"
#include "db.h"
#include <QTableWidgetItem>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_pServer = NULL;
}

Widget::~Widget()
{
    delete ui;
}

void Widget::InitServer()
{
    qDebug() << "Widget::InitServer() enter";
    if (NULL == m_pServer)
    {
        m_pServer = new QTcpServer(this);
        connect(m_pServer, SIGNAL(newConnection()), this, SLOT(OnNewConnection()));
    }
    qDebug() << "Widget::InitServer() exit";
}

void Widget::InitWidget()
{
    FUNCTION_ENTER;
    ui->tableWidget->setColumnCount(2);
    ui->tableWidget->setRowCount(5);
    QStringList strList;
    strList << "id"<<"name"  ;
    ui->tableWidget->setHorizontalHeaderLabels(strList);
    ui->tableWidget->setAutoScroll(true);
    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->tableWidget->setSelectionBehavior( QAbstractItemView::SelectRows);
    FUNCTION_EXIT;
}

void Widget::OnNewConnection()
{
    qDebug() << "new connection";
    QTcpSocket *pTmp = m_pServer->nextPendingConnection();
    if (NULL != pTmp)
    {
        connect(pTmp, SIGNAL(readyRead()), this, SLOT(Insert()));
    }
}


void Widget::on_listen_bt_clicked()
{
    qDebug() << "Widget::on_listen_bt_clicked() enter";
    if (NULL == m_pServer)
    {
        return;
    }
    QString strIP = ui->ip_edit->text();
    QString strPort = ui->port_edit->text();
    if (strIP.length() == 0 || strPort.length() == 0)
    {
        qDebug() << "input error";
        return;
    }
    bool bRet = m_pServer->listen(QHostAddress(strIP), strPort.toShort());
    if (bRet == true)
    {
        qDebug() << "server listen ok";
    }
    qDebug() << "Widget::on_listen_bt_clicked() enter";
}



void Widget::Insert()
{
    FUNCTION_ENTER;
    DBManager *pTmp = DBManager::GetInstance();
    if (NULL == pTmp)
    {
        qDebug() << "db error";
    }

    QTcpSocket *pTmps = (QTcpSocket *)sender();
    if (NULL == pTmps)
    {
        qDebug() << "socket error";
        return;
    }
    QByteArray arr = pTmps->readAll();
    //qDebug() << arr;
    QString str(arr);
    QStringList list = str.split(" ");
    QString strSql = QString("insert into text2 (id,name) values ('%1', '%2')").arg(list.at(0)).arg(list.at(1));
    int iRet = pTmp->ExecSql(strSql);
    if (iRet != DBManager::DBMANAGER_OK)
    {
        qDebug() << "insert data error";
        return;
    }
    FUNCTION_EXIT;
}

void Widget::on_pushButton_2_clicked()
{
    FUNCTION_ENTER;
    DBManager *pTmp = DBManager::GetInstance();
    if (NULL == pTmp)
    {
        qDebug() << "db error";
    }
    QString strSql = "select * from text2";
    QSqlQuery query;
    int iRet = pTmp->ExecSql(strSql, query);
    if (iRet != DBManager::DBMANAGER_OK)
    {
        qDebug() << "select data error";
        return;
    }
    int i = 0;
    while(query.next())
    {
        int j = 0;
        for (j = 0; j < 2; j++)
        {
            //qDebug() << query.value(j).toString();
            QTableWidgetItem *pItem = new QTableWidgetItem(query.value(j).toString());
            ui->tableWidget->setItem(i, j, pItem);
        }
        i++;
    }
    FUNCTION_EXIT;
}

widget.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>893</width>
    <height>629</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
  <widget class="QLabel" name="label">
   <property name="geometry">
    <rect>
     <x>80</x>
     <y>60</y>
     <width>72</width>
     <height>15</height>
    </rect>
   </property>
   <property name="text">
    <string>ip</string>
   </property>
  </widget>
  <widget class="QLineEdit" name="ip_edit">
   <property name="geometry">
    <rect>
     <x>140</x>
     <y>60</y>
     <width>221</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QLineEdit" name="port_edit">
   <property name="geometry">
    <rect>
     <x>140</x>
     <y>100</y>
     <width>221</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QLabel" name="label_2">
   <property name="geometry">
    <rect>
     <x>70</x>
     <y>100</y>
     <width>71</width>
     <height>21</height>
    </rect>
   </property>
   <property name="text">
    <string>port</string>
   </property>
  </widget>
  <widget class="QPushButton" name="listen_bt">
   <property name="geometry">
    <rect>
     <x>400</x>
     <y>100</y>
     <width>93</width>
     <height>28</height>
    </rect>
   </property>
   <property name="text">
    <string>listen</string>
   </property>
  </widget>
  <widget class="QTableWidget" name="tableWidget">
   <property name="geometry">
    <rect>
     <x>60</x>
     <y>170</y>
     <width>531</width>
     <height>301</height>
    </rect>
   </property>
  </widget>
  <widget class="QPushButton" name="pushButton_2">
   <property name="geometry">
    <rect>
     <x>670</x>
     <y>180</y>
     <width>101</width>
     <height>31</height>
    </rect>
   </property>
   <property name="text">
    <string>select</string>
   </property>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

测试

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

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

相关文章

Music Tag Editor Pro for Mac:强大的音频标签管理工具

Music Tag Editor Pro for Mac是一款专为Mac系统设计的音频标签管理工具&#xff0c;其简易直观的操作界面和强大的功能深受用户喜爱。 这款软件的核心功能在于它能够批量编辑各类音频文件的标签。无论是修改元数据、重命名文件&#xff0c;还是转换音乐标签的文本编码&#x…

(十三)Spring教程——依赖注入之工厂方法注入

1.工厂方法注入 工厂方法是在应用中被经常使用的设计模式&#xff0c;它也是控制反转和单例设计思想的主要实现方法。由于Spring IoC容器以框架的方式提供工厂方法的功能&#xff0c;并以透明的方式开放给开发者&#xff0c;所以很少需要手工编写基于工厂方法的类。正是因为工厂…

参加可观测性Observability Foundation认证培训,您有哪些收益?

一、可观测性认证培训的内容 作为SRE&#xff08;站点可靠性工程&#xff09;课程体系的最新发展&#xff0c;可观测性&#xff08;Observability&#xff09;认证课程介绍了一系列结合应用程序生命周期和复杂体系架构中推进可观测性的核心概念和实践。为关注全栈可观测性&…

Hyper-V 安装 CentOS 8.5

前言 Hyper-V安装文档:在 Windows 10 上安装 Hyper-VCentOS 系统下载:CentOS 国内镜像源 8.5.2111作者:易墨发布时间:2023.10.01原文地址:https://www.cnblogs.com/morang/p/devops-hyperv-centos-install.html使用命令安装 以管理员身份运行 PowerShell 命令: Enable-…

【React】全面解析:从基础知识到高级应用,掌握现代Web开发利器

文章目录 一、React 的基础知识1. 什么是 React&#xff1f;2. React 的基本概念3. 基本示例 二、React 的进阶概念1. 状态&#xff08;State&#xff09;和属性&#xff08;Props&#xff09;2. 生命周期方法&#xff08;Lifecycle Methods&#xff09;3. 钩子&#xff08;Hoo…

pikauchu之Unsafe Fileupload(不安全的文件上传)

Client check&#xff08;客户检查&#xff09; 第一步先新建一个一句话木马 <?php eval($_POST[1]);?> 然后上传文件 有限制&#xff0c;只能上传那几种类型 现在看看源代码 我们将一句话木马文件的后缀改为png 然后用burp抓包&#xff0c;将png改成php 就能上传成功 …

Android中Service学习记录

目录 一 概述二 生命周期2.1 启动服务startService()2.2 绑定服务bindService()2.3 先启动后绑定2.4 先绑定后启动 三 使用3.1 本地服务&#xff08;启动式&#xff09;3.2 可通信的服务&#xff08;绑定式&#xff09;3.3 前台服务3.4 IntentService 总结参考 一 概述 Servic…

无人机之起飞前准备

一、检查无人机状态 1、确保无人机的电池充满电或有足够的电量&#xff1b; 2、检查螺旋桨是否安装牢固&#xff0c;没有损坏&#xff1b; 3、确认无人机的固件是最新版本&#xff0c;以保证拥有最新的功能和修正。 二、选择合适的起飞地点 1、避免在人群密集或有障碍物的…

husky引发git commit报错的解决方案

在git commit的时候&#xff0c;有可能会遇到这样的报错&#xff0c;husky - pre-commit hook exited with code 1 (error) 出现这个问题的原因主要是&#xff0c;假如项目中采用 husky和lint-staged结合进行代码校验&#xff0c;那么&#xff0c;只要项目代码中有不规范的地方…

新手学习python 安装Anaconda

PyCharm选择社区版就够用了&#xff0c;专业版本太多花哨的东西没必要&#xff0c;环境可以用Anaconda&#xff0c;单纯的python环境需要下载很多包 一&#xff1a;安装Anaconda 下载打包坏境 Anaconda 地址 https://www.anaconda.com/&#xff0c;我本地是安装在D:\ProgramD…

CTF ssti零基础(一) 模块注入的payload

这里先推荐一个还不错的工具 git clone https://github.com/vladko312/SSTImap.gitcd SSTImappip install requirements.txt命令还是挺多的 有点像sqlmap但是这个暴力多了不用加那么多的参数 ./sstimap.py -u http://example.com ./sstimap.py -u http://example.com --os-sh…

Word 导入导出

在实际的开发过程中&#xff0c;也会遇到导入导出的功能&#xff0c;今天就简单的做一下总结。 1.需求&#xff1a;将下面word 数据导入到数据库并进行存储 在Controller中 RequestMapping(value "/ImportWord")public RawResponseBodyObject ImportWord(HttpServl…

怎么将jpg图片转换为pdf?将jpg图片转换为pdf的几种方法介绍

怎么将jpg图片转换为pdf&#xff1f;转换jpg图片为PDF是一项常见的任务&#xff0c;无论是个人用户还是商业环境中都经常会遇到这种需求。将多张jpg图像合并成一个单一的PDF文件可以带来诸多便利&#xff0c;例如便于存档、分享和打印。这种转换不仅简化了文件管理流程&#xf…

萝卜快跑:自动驾驶的先锋与挑战

萝卜快跑&#xff1a;自动驾驶的先锋与挑战 近段时间&#xff0c;由萝卜快跑引发的自动驾驶事件如火如荼&#xff0c;成为科技领域的热门话题。萝卜快跑作为自动驾驶领域的重要参与者&#xff0c;其最新事件引发了广泛的关注和讨论。 萝卜快跑是百度推出的自动驾驶出行服务平台…

计算机网络基础:4.HTTP与HTTPS

一、回顾设定 想象你在经营一家繁忙的餐厅&#xff0c;顾客们通过点餐系统&#xff08;网卡&#xff09;下单&#xff0c;订单被前台&#xff08;路由器&#xff09;接收并分发到各个厨房区域&#xff08;网络设备&#xff09;。光猫像是食材供应商&#xff0c;通过高效的物流系…

2、LangChain —— RAG基本架构

文章目录 一、概述二、什么是 RAG三、概念1、Indexing2、Retrieval and generation 四、设置1、下载安装 langchain2、LangSmith 五、一个简单的RAG后端1、Load2、Split3、Embedding and Store4、Retrieval5、Generate 一、概述 LLM 支持的最强大的应用程序之一是 复杂的问答 (…

MySQL中实现动态表单中JSON元素精准匹配的方法

目录 前言 一、动态表单技术 1、包含的主要信息 2、元素属性设置 3、表单内容 二、表单数据存储和查询 1、数据存储 2、数据的查询 3、在5.7版本中进行JSON检索 4、8.0后的优化查询 三、总结 前言 在很多有工作流设置的地方、比如需要在不同的流程中&#xff0c;需要…

【八股系列】JavaScript如何判断一个对象是否属于某个类?

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【探索扫描二维码登录的奥秘&#xff1a;从前端到后端的无缝连接】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐…

基于单片机控制的家电产品硬件故障诊断

摘要&#xff1a; 在现阶段家用电子产品生产制造的过程中&#xff0c;需要应用到非常多的单片机以及单片机控制技术&#xff0c;单片机凭借着自身体积小、反应快、功耗低的优势迅速抢占了家电产品的市场。并且在单片机实际的应用过程中&#xff0c;通过对单片机控制技术的掌握可…

HarmonyOS 本地真机运行

目录 官网地址 1.开发工具设置签名 2.手机开启开发者模式 3.使用USB连接方式 4.使用无线调试连接方式 5.常见的问题 官网地址 使用真机运行应用 使用本地真机运行应用/服务 1.开发工具设置签名 官网应用/服务签名 1.左上角文件--项目结构-勾选自动生成签名-Sign in登录 2…