QT 设计一个串口调试工具,用一个工程就能轻松解决,外加虚拟串口工具模拟调试,在日常工作中可类比模块间通信,非常详细建议收藏
QT 串口调试工具
- 第一节 虚拟串口工具安装
- 第二节 QT创建一个基于QWidget的项目
- 第三节 UI界面设计
- 第三节 项目头文件widget.h
- 第四节 项目实现文件widget.cpp
- 第五节 main函数
- 第六节 编译结果重点
- 第七节 使用QT打包程序,不安装QT的电脑可使用
第一节 虚拟串口工具安装
-----------------------------------------下载所需工具---------------------------------------------------------------------
链接:https://pan.baidu.com/s/1QkT36S4EnH2HEAhZ1TZ8ug?pwd=ilqg
提取码:ilqg
-------------------------------------首先点击.exe文件-----------------------------------------------------------------------
------------------------------------安装在指定目录等下要用--------------------------------------------------
将vspdctl.dll替换掉你安装文件的所在目录,不然出现错误,就掉头发了哦
-------------------------------------打开软件看看有啥---------------------------------------------------=
注意
:请记住这里的操作,后面还要用到
-------------------------------------------通过上面的操作,出现以下界面,说明设置成功---------------------
点击电脑—管理—设备管理器–端口–可以看到成功了
第二节 QT创建一个基于QWidget的项目
项目.pro添加以下信息
# 添加串口
QT += serialport
第三节 UI界面设计
这里不多说,只要是按钮都要转到槽,具体槽函数请看源代码
第三节 项目头文件widget.h
使用两个串口对象实现
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSerialPort> //提供访问串口得到功能
#include <QSerialPortInfo> //提供系统中存在的串口信息
#include <QMessageBox> //信息弹出框
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE//使用枚举保存波特率
typedef enum
{B1200 =1200,B9600 = 9600,B115200 = 115200,B921600 = 921600
}Baud;class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots://接收串口数据void SerialPortReadyRead(); //比作COM6void Serial2PortReadyRead(); //比作COM7private slots:void on_PB_receive_clicked();void on_PB_send_clicked();void on_PB_detectserial_clicked();void on_PB_openserial_clicked();void on_comboBox_b_currentIndexChanged(int index);void on_PB_openserial_2_clicked();void on_PB_send_2_clicked();private:Ui::Widget *ui;QSerialPort serial; //串口1QSerialPort serial2; //串口2
};
#endif // WIDGET_H
-------------------------------------------------------------------------------------------------------------------------------------
第四节 项目实现文件widget.cpp
----------------------实现信号与槽,信号为缓冲区有数据时,槽函数作为接收数据------------------------------------
//连接信号与槽QObject::connect(&serial, SIGNAL(readyRead()),this, SLOT(SerialPortReadyRead()));QObject::connect(&serial2, SIGNAL(readyRead()),this, SLOT(Serial2PortReadyRead()));
------------------------------------------------串口对象一次性读取全部----------------------------------------------------------
//串口2接收串口1数据
void Widget::SerialPortReadyRead()
{qDebug()<<"===============有数据==================";//从缓冲区读取文件QByteArray buffer = serial.readAll();//获取界面已经读取的数据QString recv = ui->plainTextEdit_2->toPlainText();recv +=QString(buffer);//显示全部ui->plainTextEdit_2->appendPlainText(recv);
}
//串口1接收串口2数据
void Widget::Serial2PortReadyRead()
{qDebug()<<"===============有数据2==================";//从缓冲区读取文件QByteArray buffer = serial2.readAll();//获取界面已经读取的数据QString recv = ui->plainTextEdit->toPlainText();recv +=QString(buffer);//显示全部ui->plainTextEdit->appendPlainText(recv);
}
--------------------------------------------------------------向串口写入数据------------------------------------------------------
//作为串口1
void Widget::on_PB_send_clicked()
{//向串口写入数据QByteArray data = ui->plainTextEdit_2->toPlainText().toUtf8();qDebug()<<"发送数据 data = "<<data;serial.write(data);if(!serial.isWritable())qDebug()<<"写入失败";
}
//作为串口2
void Widget::on_PB_send_2_clicked()
{//向串口2写入数据QByteArray data = ui->plainTextEdit->toPlainText().toUtf8();qDebug()<<"发送数据 data2 = "<<data;serial2.write(data);if(!serial2.isWritable())qDebug()<<"写入失败";
}
-----------------------------------------配置串口并打开--------------------------------------------------------------------
void Widget::on_PB_openserial_clicked()
{if(ui->PB_openserial->text() == QString("打开串口1")){//设置串口名serial.setPortName(ui->comboBox_id->currentText());//设置波特率serial.setBaudRate(ui->comboBox_b->currentText().toUInt());//设置数据位switch (ui->comboBox_data->currentIndex()){case 8:serial.setDataBits(QSerialPort::Data8);break;default:break;}//设置奇偶校验 无switch (ui->comboBox_crc->currentIndex()){case 0:serial.setParity(QSerialPort::NoParity);break;default:break;}//设置停止位switch (ui->comboBox_stop->currentIndex()){case 1:serial.setStopBits(QSerialPort::OneStop);break;default:break;}//设置流控 无serial.setFlowControl(QSerialPort::NoFlowControl);//打开串口if(!serial.open(QIODevice::ReadWrite)){QMessageBox::about(NULL,"提示","串口1打开失败");}if(serial.isOpen())QMessageBox::about(NULL,"提示","串口1打开成功");//下拉菜单控件失能ui->comboBox_b->setEnabled(false);ui->comboBox_id->setEnabled(false);ui->comboBox_crc->setEnabled(false);ui->comboBox_data->setEnabled(false);ui->comboBox_stop->setEnabled(false);ui->PB_openserial->setText(tr("关闭串口1"));//发送按键使能ui->PB_send->setEnabled(true);}else{//关闭串口serial.close();//下拉使能ui->comboBox_b->setEnabled(true);ui->comboBox_id->setEnabled(true);ui->comboBox_crc->setEnabled(true);ui->comboBox_data->setEnabled(true);ui->comboBox_stop->setEnabled(true);ui->PB_openserial->setText(tr("打开串口1"));//发送失能ui->PB_send->setEnabled(false);}
}//获取波特率索引
void Widget::on_comboBox_b_currentIndexChanged(int index)
{if(ui->comboBox_b->itemText(index).toUInt() == B9600){qDebug()<<"itemText = "<<ui->comboBox_b->itemText(index);ui->comboBox_b->setCurrentIndex(index);}else if(ui->comboBox_b->itemText(index).toUInt() == B115200){qDebug()<<"itemText = "<<ui->comboBox_b->itemText(index);ui->comboBox_b->setCurrentIndex(index);}
}void Widget::on_PB_openserial_2_clicked()
{if(ui->PB_openserial_2->text() == QString("打开串口2")){//设置串口名serial2.setPortName(ui->comboBox_id_2->currentText());//设置波特率serial2.setBaudRate(ui->comboBox_b->currentText().toUInt());//设置数据位switch (ui->comboBox_data->currentIndex()){case 8:serial2.setDataBits(QSerialPort::Data8);break;default:break;}//设置奇偶校验 无switch (ui->comboBox_crc->currentIndex()){case 0:serial2.setParity(QSerialPort::NoParity);break;default:break;}//设置停止位switch (ui->comboBox_stop->currentIndex()){case 1:serial2.setStopBits(QSerialPort::OneStop);break;default:break;}//设置流控 无serial2.setFlowControl(QSerialPort::NoFlowControl);//打开串口if(!serial2.open(QIODevice::ReadWrite)){QMessageBox::about(NULL,"提示","串口2打开失败");}if(serial2.isOpen())QMessageBox::about(NULL,"提示","串口2打开成功");//下拉菜单控件失能ui->comboBox_b->setEnabled(false);ui->comboBox_id_2->setEnabled(false);ui->comboBox_crc->setEnabled(false);ui->comboBox_data->setEnabled(false);ui->comboBox_stop->setEnabled(false);ui->PB_openserial_2->setText(tr("关闭串口2"));//发送按键使能ui->PB_send_2->setEnabled(true);}else{//关闭串口serial2.close();//下拉使能ui->comboBox_b->setEnabled(true);ui->comboBox_id_2->setEnabled(true);ui->comboBox_crc->setEnabled(true);ui->comboBox_data->setEnabled(true);ui->comboBox_stop->setEnabled(true);ui->PB_openserial_2->setText(tr("打开串口2"));//发送失能ui->PB_send_2->setEnabled(false);}
}
-----------------------------------------------------------------源码------------------------------------------------------------
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//连接信号与槽QObject::connect(&serial, SIGNAL(readyRead()),this, SLOT(SerialPortReadyRead()));QObject::connect(&serial2, SIGNAL(readyRead()),this, SLOT(Serial2PortReadyRead()));//发送按钮不使能ui->PB_send->setDisabled(true);ui->PB_send_2->setDisabled(true);
}Widget::~Widget()
{delete ui;
}//串口2接收串口1数据
void Widget::SerialPortReadyRead()
{qDebug()<<"===============有数据==================";//从缓冲区读取文件QByteArray buffer = serial.readAll();//获取界面已经读取的数据QString recv = ui->plainTextEdit_2->toPlainText();recv +=QString(buffer);//显示全部ui->plainTextEdit_2->appendPlainText(recv);
}
//串口1接收串口2数据
void Widget::Serial2PortReadyRead()
{qDebug()<<"===============有数据2==================";//从缓冲区读取文件QByteArray buffer = serial2.readAll();//获取界面已经读取的数据QString recv = ui->plainTextEdit->toPlainText();recv +=QString(buffer);//显示全部ui->plainTextEdit->appendPlainText(recv);
}void Widget::on_PB_receive_clicked()
{//清空接收框数据ui->plainTextEdit->clear();ui->plainTextEdit_2->clear();
}
//作为串口1
void Widget::on_PB_send_clicked()
{//向串口写入数据QByteArray data = ui->plainTextEdit_2->toPlainText().toUtf8();qDebug()<<"发送数据 data = "<<data;serial.write(data);if(!serial.isWritable())qDebug()<<"写入失败";
}
//作为串口2
void Widget::on_PB_send_2_clicked()
{//向串口2写入数据QByteArray data = ui->plainTextEdit->toPlainText().toUtf8();qDebug()<<"发送数据 data2 = "<<data;serial2.write(data);if(!serial2.isWritable())qDebug()<<"写入失败";
}
//检测串口
void Widget::on_PB_detectserial_clicked()
{//清空串口idui->comboBox_id->clear();ui->comboBox_id_2->clear();//通过这个类查找可用串口1foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){qDebug()<<"info.portName() = "<<info.portName();ui->comboBox_id->addItem(info.portName());}//通过这个类查找可用串口2foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){qDebug()<<"info.portName() = "<<info.portName();ui->comboBox_id_2->addItem(info.portName());}
}void Widget::on_PB_openserial_clicked()
{if(ui->PB_openserial->text() == QString("打开串口1")){//设置串口名serial.setPortName(ui->comboBox_id->currentText());//设置波特率serial.setBaudRate(ui->comboBox_b->currentText().toUInt());//设置数据位switch (ui->comboBox_data->currentIndex()){case 8:serial.setDataBits(QSerialPort::Data8);break;default:break;}//设置奇偶校验 无switch (ui->comboBox_crc->currentIndex()){case 0:serial.setParity(QSerialPort::NoParity);break;default:break;}//设置停止位switch (ui->comboBox_stop->currentIndex()){case 1:serial.setStopBits(QSerialPort::OneStop);break;default:break;}//设置流控 无serial.setFlowControl(QSerialPort::NoFlowControl);//打开串口if(!serial.open(QIODevice::ReadWrite)){QMessageBox::about(NULL,"提示","串口1打开失败");}if(serial.isOpen())QMessageBox::about(NULL,"提示","串口1打开成功");//下拉菜单控件失能ui->comboBox_b->setEnabled(false);ui->comboBox_id->setEnabled(false);ui->comboBox_crc->setEnabled(false);ui->comboBox_data->setEnabled(false);ui->comboBox_stop->setEnabled(false);ui->PB_openserial->setText(tr("关闭串口1"));//发送按键使能ui->PB_send->setEnabled(true);}else{//关闭串口serial.close();//下拉使能ui->comboBox_b->setEnabled(true);ui->comboBox_id->setEnabled(true);ui->comboBox_crc->setEnabled(true);ui->comboBox_data->setEnabled(true);ui->comboBox_stop->setEnabled(true);ui->PB_openserial->setText(tr("打开串口1"));//发送失能ui->PB_send->setEnabled(false);}
}//获取波特率索引
void Widget::on_comboBox_b_currentIndexChanged(int index)
{if(ui->comboBox_b->itemText(index).toUInt() == B9600){qDebug()<<"itemText = "<<ui->comboBox_b->itemText(index);ui->comboBox_b->setCurrentIndex(index);}else if(ui->comboBox_b->itemText(index).toUInt() == B115200){qDebug()<<"itemText = "<<ui->comboBox_b->itemText(index);ui->comboBox_b->setCurrentIndex(index);}
}void Widget::on_PB_openserial_2_clicked()
{if(ui->PB_openserial_2->text() == QString("打开串口2")){//设置串口名serial2.setPortName(ui->comboBox_id_2->currentText());//设置波特率serial2.setBaudRate(ui->comboBox_b->currentText().toUInt());//设置数据位switch (ui->comboBox_data->currentIndex()){case 8:serial2.setDataBits(QSerialPort::Data8);break;default:break;}//设置奇偶校验 无switch (ui->comboBox_crc->currentIndex()){case 0:serial2.setParity(QSerialPort::NoParity);break;default:break;}//设置停止位switch (ui->comboBox_stop->currentIndex()){case 1:serial2.setStopBits(QSerialPort::OneStop);break;default:break;}//设置流控 无serial2.setFlowControl(QSerialPort::NoFlowControl);//打开串口if(!serial2.open(QIODevice::ReadWrite)){QMessageBox::about(NULL,"提示","串口2打开失败");}if(serial2.isOpen())QMessageBox::about(NULL,"提示","串口2打开成功");//下拉菜单控件失能ui->comboBox_b->setEnabled(false);ui->comboBox_id_2->setEnabled(false);ui->comboBox_crc->setEnabled(false);ui->comboBox_data->setEnabled(false);ui->comboBox_stop->setEnabled(false);ui->PB_openserial_2->setText(tr("关闭串口2"));//发送按键使能ui->PB_send_2->setEnabled(true);}else{//关闭串口serial2.close();//下拉使能ui->comboBox_b->setEnabled(true);ui->comboBox_id_2->setEnabled(true);ui->comboBox_crc->setEnabled(true);ui->comboBox_data->setEnabled(true);ui->comboBox_stop->setEnabled(true);ui->PB_openserial_2->setText(tr("打开串口2"));//发送失能ui->PB_send_2->setEnabled(false);}
}
第五节 main函数
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
第六节 编译结果重点
--------------------------------不想编写两个串口的,安装的串口助手里面有一个工具----------------------------------
可以看到,可以实现所需的功能
第七节 使用QT打包程序,不安装QT的电脑可使用
第一步QT编译使用如下
第二部,执行上述以后,去以下目录复制.exe文件到一个新建的文件夹
以管理员身份打开cmd,进入的这个新建的文件夹
windeployqt.exe 你的.exe文件名
由于没有一台未安装QT的电脑作为模拟,有些遗憾
为了提高成功率打开如下:
cd D:\Qt\Qt5.14.2\Tools\QtCreator\bin
进入以上目录,执行如下命令
D:\Qt\Qt5.14.2\5.14.2\mingw73_64>windeployqt.exe C:\Users\ll\Desktop\QT串口工具\QSerialPort.exe
-------------------------------------本次任务over-----------------------------------------------------------
相关文章:

QT 设计一个串口调试工具,用一个工程就能轻松解决,外加虚拟串口工具模拟调试,在日常工作中可类比模块间通信,非常详细建议收藏
QT 串口调试工具第一节 虚拟串口工具安装第二节 QT创建一个基于QWidget的项目第三节 UI界面设计第三节 项目头文件widget.h第四节 项目实现文件widget.cpp第五节 main函数第六节 编译结果重点第七节 使用QT打包程序,不安装QT的电脑可使用第一节 虚拟串口工具安装 -…...

OpenSumi 是信创开发云的首选
原文作者:行云创新技术总监 邓冰寒 引言 随着云原生应用的日益普及,开发上云也逐步被越来越多的厂商和开发者接受,在这个赛道国内外有不少玩家,国外的 GitHub Codespaces、CodeSandbox,GitPod、亚马逊 Cloud9…...

JdbcTemplate常用方法解析
文章目录1.JdbcTemplate简介2.JdbcTemplate主要方法:3.常用方法介绍update()方法增删改query()查询方法1.JdbcTemplate简介 JdbcTemplate是Spring JDBC的核心类,借助该类提供的方法可以很方便的实现数据的增删改查。 Spring对数据库的操作在jdbc上面做…...

生物素标记试剂1869922-24-6,Alkyne-PEG3-Biotin PC,炔烃PEG3生物素PC
1、试剂基团反应特点(Reagent group reaction characteristics):PC alkyne-PEG3-Biotin含一个炔烃和一个 PEG 链接的可光裂解生物素基团。含 3 个单元 PEG 的 ADC linker,生物素本身是个游离的小分子,在生物实验中常常…...

CS224W课程学习笔记(三):DeepWalk算法原理与说明
引言 什么是图嵌入? 图嵌入(Graph Embedding,也叫Network Embedding) 是一种将图数据(通常为高维稠密的矩阵)映射为低微稠密向量的过程,能够很好地解决图数据难以高效输入机器学习算法的问题。…...

rk3568 开发板Ubuntu系统说明
Ubuntu MinimalUbuntu Minimal系统基于Ubuntu 64bit系统构建,目前发布有Ubuntu18.04这个版本。与Ubuntu Desktop 相比具有以下特性:没有桌面环境,占用资源少,在简化网络管理之后,只需40M内存;针对嵌入式平台…...
Windows和Linux常用HASH算法使用命令
Windows和Linux常用hash算法使用命令 Windows,以文件xxx.zip为例 Windows 求文件 md5 certutil -hashfile xxx.zip md5Windows 求文件 sha1 certutil -hashfile xxx.zip sha1Windows 求文件 sha256 certutil -hashfile xxx.zip sha256Linux,以文件xxx.z…...

货仓选址 AcWing(JAVA)
在一条数轴上有 N家商店,它们的坐标分别为 A1∼AN。 现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送商品。 为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。 输入格式&#…...

SPI+DMA传输性能比较
本文章仅仅简单记录32单片机的SPIDMA驱动显示屏的性能测试,这里不花费时间介绍SPI和DMA。 硬件材料:SPI显示屏一个,32单片机 软件材料: 1.LCD的SPI驱动显示程序(SPI / SPIDMA): (1&a…...

Centos7系统编译Hadoop3.3.4
1、背景 最近在学习hadoop,此篇文章简单记录一下通过源码来编译hadoop。为什么要重新编译hadoop源码,是因为为了匹配不同操作系统的本地库环境。 2、编译源码 2.1 下载并解压源码 [roothadoop01 ~]# mkdir /opt/hadoop [roothadoop01 ~]# cd /opt/had…...
pb并发控制
并发控制(一) 并发能力是指多用户在同一时间对相同数据同时访问的能力。一般的关系型数据库都具 有并发控制的能力,但是这种并发功能也会对数据的一致性带来危险。试想若有两个用 户都试图访问某个银行用户的记录并同时要求修改该用户的存款余额时,情况将会怎样 呢?我们可以…...
登录拦截器
文章目录前言一、interceptor1.interceptor 包下新建loginInterceptor.java2.config 包下新建 AdminWebConfig.java3.返回登录页面接收提示信息前言 本篇主要介绍spring框架里提供的 HandlerInterceptor 拦截器做登录拦截。 一、interceptor 1.interceptor 包下新建loginInte…...
STM32 - HAL库UART串口
1.串口初始化配置/******************************************************************************* Function: BSP_UART_Init Description: 串口初始化 Input: instance 串口号baudRate: 波特率 Output: 无 Return: 无 ************************************************…...
Vue3 的状态管理库(Pinia)
目录前言:一、什么是 Pinai二、安装与使用pinia三、什么是 store四、state1. 定义 state2. 组件中访问 state五、Getters1. 定义 Getters2. 在组件中使用 Getters六、Actions1. 定义Actions2. 组件中访问 Actions总结:前言: 在编写vue里的项目…...

信息系统项目管理师知识点汇总(2023最新)
信息系统项目管理师 信息系统项目管理师简介如何应对考试考试细节与学习 十大管理 十大管理四十七过程 信息化和信息系统 项目管理基础 项目整体管理 项目范围管理 项目进度管理 项目成本管理 项目质量管理 项目人力资源管理 项目沟通管理 项目干系人管理 项目风险…...

标题标题标题
图床(Typora uPic/PicGo 七牛云) 图床(Typora uPic/PicGo 七牛云) 笔者平时使用 Typora 编写 markdown 文档,文档中常常会放置图片,如果文档不需要分享的话,其实讲图片存放在本地就可以了…...
OKR学习总结二
总结 绩效管理不是进行事后管理,而是参与整个过程并进行实时把控。 我们将受益目标分为两个子目标: 新增收入和重复收入。第一部分目标由市场营销部承担,第二个目标则由产品部承担。 简而言之,文化是一系列价值观和信仰的体现&…...

MAC中docker搭建fastdfs
1:首先搭建Docker2:通过Docker搭建fastdfs(1)查找镜像打开终端通命令查找fastdfs的镜像docker search fastdfs(二)拉取镜像在找到合适的镜像后执行命令:docker pull delron/fastdfs(三) 创建storage和track…...

JavaScript 变量
变量是用于存储信息的"容器"。实例var x5;var y6;var zxy;尝试一下 就像代数那样x5y6zxy在代数中,我们使用字母(比如 x)来保存值(比如 5)。通过上面的表达式 zxy,我们能够计算出 z 的值为 11。在…...
【前端验证】环境仿真中对于寄存器配置的随机策略讨论
前言 本篇文章旨在讨论环境仿真中对于寄存器配置的随机。 寄存器域的随机性 使用ralgen生成的寄存器本身是rand属性的,也就是说其自身是可以通过约束随机的方式在用例中进行随机性配置的,比如下面这个寄存器: class ral_reg_REG_PRJ_sys_cfg_base_config extends uvm_re…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...