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

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打包程序&#xff0c;不安装QT的电脑可使用第一节 虚拟串口工具安装 -…...

OpenSumi 是信创开发云的首选

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

JdbcTemplate常用方法解析

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

生物素标记试剂1869922-24-6,Alkyne-PEG3-Biotin PC,炔烃PEG3生物素PC

1、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a;PC alkyne-PEG3-Biotin含一个炔烃和一个 PEG 链接的可光裂解生物素基团。含 3 个单元 PEG 的 ADC linker&#xff0c;生物素本身是个游离的小分子&#xff0c;在生物实验中常常…...

CS224W课程学习笔记(三):DeepWalk算法原理与说明

引言 什么是图嵌入&#xff1f; 图嵌入&#xff08;Graph Embedding&#xff0c;也叫Network Embedding&#xff09; 是一种将图数据&#xff08;通常为高维稠密的矩阵&#xff09;映射为低微稠密向量的过程&#xff0c;能够很好地解决图数据难以高效输入机器学习算法的问题。…...

rk3568 开发板Ubuntu系统说明

Ubuntu MinimalUbuntu Minimal系统基于Ubuntu 64bit系统构建&#xff0c;目前发布有Ubuntu18.04这个版本。与Ubuntu Desktop 相比具有以下特性&#xff1a;没有桌面环境&#xff0c;占用资源少&#xff0c;在简化网络管理之后&#xff0c;只需40M内存&#xff1b;针对嵌入式平台…...

Windows和Linux常用HASH算法使用命令

Windows和Linux常用hash算法使用命令 Windows&#xff0c;以文件xxx.zip为例 Windows 求文件 md5 certutil -hashfile xxx.zip md5Windows 求文件 sha1 certutil -hashfile xxx.zip sha1Windows 求文件 sha256 certutil -hashfile xxx.zip sha256Linux&#xff0c;以文件xxx.z…...

货仓选址 AcWing(JAVA)

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

SPI+DMA传输性能比较

本文章仅仅简单记录32单片机的SPIDMA驱动显示屏的性能测试&#xff0c;这里不花费时间介绍SPI和DMA。 硬件材料&#xff1a;SPI显示屏一个&#xff0c;32单片机 软件材料&#xff1a; 1.LCD的SPI驱动显示程序&#xff08;SPI / SPIDMA&#xff09;&#xff1a; &#xff08;1&a…...

Centos7系统编译Hadoop3.3.4

1、背景 最近在学习hadoop&#xff0c;此篇文章简单记录一下通过源码来编译hadoop。为什么要重新编译hadoop源码&#xff0c;是因为为了匹配不同操作系统的本地库环境。 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)

目录前言&#xff1a;一、什么是 Pinai二、安装与使用pinia三、什么是 store四、state1. 定义 state2. 组件中访问 state五、Getters1. 定义 Getters2. 在组件中使用 Getters六、Actions1. 定义Actions2. 组件中访问 Actions总结&#xff1a;前言&#xff1a; 在编写vue里的项目…...

信息系统项目管理师知识点汇总(2023最新)

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

标题标题标题

图床&#xff08;Typora uPic/PicGo 七牛云&#xff09; 图床&#xff08;Typora uPic/PicGo 七牛云&#xff09; 笔者平时使用 Typora 编写 markdown 文档&#xff0c;文档中常常会放置图片&#xff0c;如果文档不需要分享的话&#xff0c;其实讲图片存放在本地就可以了…...

OKR学习总结二

总结 绩效管理不是进行事后管理&#xff0c;而是参与整个过程并进行实时把控。 我们将受益目标分为两个子目标&#xff1a; 新增收入和重复收入。第一部分目标由市场营销部承担&#xff0c;第二个目标则由产品部承担。 简而言之&#xff0c;文化是一系列价值观和信仰的体现&…...

MAC中docker搭建fastdfs

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

JavaScript 变量

变量是用于存储信息的"容器"。实例var x5;var y6;var zxy;尝试一下 就像代数那样x5y6zxy在代数中&#xff0c;我们使用字母&#xff08;比如 x&#xff09;来保存值&#xff08;比如 5&#xff09;。通过上面的表达式 zxy&#xff0c;我们能够计算出 z 的值为 11。在…...

【前端验证】环境仿真中对于寄存器配置的随机策略讨论

前言 本篇文章旨在讨论环境仿真中对于寄存器配置的随机。 寄存器域的随机性 使用ralgen生成的寄存器本身是rand属性的,也就是说其自身是可以通过约束随机的方式在用例中进行随机性配置的,比如下面这个寄存器: class ral_reg_REG_PRJ_sys_cfg_base_config extends uvm_re…...

Servlet如何读取Web资源文件?【操作演示】

在实际开发中&#xff0c;有时候可能会需要读取Web应用中的一些资源文件&#xff0c;比如配置文件&#xff0c;图片等。为此&#xff0c;在ServletContext接口中定义了一些读取Web资源的方法&#xff0c;这些方法是依靠Servlet容器来实现的。Servlet容器根据资源文件相对于Web应…...

[ vulhub漏洞复现篇 ] Drupal 远程代码执行漏洞(CVE-2019-6339)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…...

flex-shrink和felx-grow

本文就是简单的介绍下flex-shrink和felx-grow的作用和计算方式吧&#xff1b;关于这个介绍也是很多&#xff1b;flex-shrinkflex-shrink是flex布局中的一种方式&#xff0c;简单来说&#xff0c;就是当布局大小小于容器大小的时候&#xff0c;使用flex-shrink能够按照一定的比例…...

将HTTP接口配置成HTTPS

一、使用Java的keytool.exe程序生成本机的TLS许可找到Java的jdk目录进入bin默认安装路径C:\Program Files\Java\jdk1.8.0_91\bin 进入命令面板&#xff0c;在bin的路径栏中输入cmd敲击回车即可使用keytoolkeytool -genkeypair -alias tomcat_https -keypass 123456 -keyalg RSA…...

YOLOV5报错解决办法

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓YOLOV5报错解决办法&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 1.在pycharm终端使用pip install…...

java final关键字 详解

概述&#xff1a;作用&#xff1a;细节&#xff1a;演示&#xff1a;总结&#xff1a;一、概述 : final [ˈ faɪnl]&#xff0c;最终的&#xff0c;最后的&#xff0c;决定性的&#xff0c;不可改变的。final作为Java中的一个关键字可以用来修饰类&#xff0c;方法&#xff0c…...

Vbs_To_Exe制作简易exe程序

文章目录一、准备vbs脚本文件二、工具打包exe一、准备vbs脚本文件 新建一个文本文档 复制下面代码到文本文档中 Set speech CreateObject("SAPI.SpVoice") speech.Speak "l love you!"修改文本后缀为.vbs。编码选择ANSI&#xff08;解决中文乱码问题&am…...

AI制药 - TMScore(US-align)、RMSD、Sequence 源码

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/129125467 参考文档:Nature Methods | 蛋白、RNA、DNA及其复合物结构的比对算法US-align 官网地址:https://zhanggroup.org/US-align/ TMScore TMScore,…...

关于个人的经历

简介 我是一个意外接触微机技术的五年专生(前三年寄读一个中专&#xff0c;后两年回大专学校)&#xff0c;2020年中考失利&#xff0c;以高中线上30分去了现在所在五年专&#xff0c;专业是软件&#xff0c;目前个人已过程序员&#xff0c;网管&#xff0c;信息处理员&#xff…...

设计在单链表中删除值相同的多余结点的算法(包括指针的引用的知识点)

1 C中指针与引用的区别 引用相当于起别名int m; int &n m;n 相当于 m 的别名&#xff08;绰号&#xff09;&#xff0c;对 n 的任何操作就是对m的操作。 所以 n 既不是m的拷贝&#xff0c;也不是指向 m 的指针&#xff0c;其实n就是 m 它自己。 引用的注意事项&#xff…...

广东品牌网站建设/微信推广朋友圈广告

详解Linux命令中&#xff1b;、|、& 、&& 、 ||之间的区别?一、";"分号的用法方式&#xff1a;command1 ; command2用;号隔开每个命令, 每个命令按照从左到右的顺序,顺序执行&#xff0c; 彼此之间不关心是否失败&#xff0c; 所有命令都会执行。二、&q…...

做相册网站logo/网推怎么做

转载于:https://www.cnblogs.com/6DAN_HUST/archive/2013/06/02/3114323.html...

响应式网站和传统网站/如何做好网络宣传工作

1.空格 <view> <text space"ensp">你好 啊 哈哈哈&#xff08;空格是中文字符一半大小&#xff09;</text> </view><view> <text space"emsp">你好 啊 哈哈哈&#xff08;空格是中文字符大小&#xff09;</text>…...

网站建设实训日记/北京全网营销推广公司

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼sqlplus 运行脚本prvtlmpg.plb 报错&#xff0c;请问各位大神有什么解决方法SQL> prvtlmpg.plbOracle GoldenGate Workaround prvtlmpgThis script provides a temporary workaround for bug 17030189.It is strongly recommend…...

大学生做网站兼职/免费seo快速排名工具

一、问题&#xff1a; cmd输入javac显示不是内部或外部文件&#xff0c;如下图 二、解决方法&#xff1a; 我搜了网上的方法&#xff0c;重启cmd&#xff0c;并无卵用。 然后有说环境变量里系统变量的JAVA_HOME,CLASSPATH设置错误的。我检查了一遍也没有问题。 还有说什…...

下载用的网站怎么做/网站开发是做什么的

一、 4.2.5版本下载 链接: https://pan.baidu.com/s/1qKQ9Kzb7qtjfwu8msBNRHA 密码: seun 二、安装 先将下载好的压缩包解压&#xff0c;然后打开 shell 终端&#xff0c;切换到你已经解压好的文件的bin目录下&#xff0c;然后执行下面的命令&#xff1a; install_compass …...