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

基于STM32的传感器数据采集系统设计:Qt、RS485、Modbus Rtu协议(代码示例)

一、项目概述

项目目标与用途

本项目旨在设计并实现一个基于STM32F103RCT6微控制器的传感器数据采集系统。该系统通过多个传感器实时监测环境参数,并将采集到的数据传输至上位机进行处理和分析。系统的主要应用领域包括环境监测、工业控制、智能家居等。通过该系统,用户能够实时获取传感器数据,进行数据存储和分析,并具备限位报警、状态判断、故障监测等功能,以提高监测的及时性和有效性。

技术栈关键词

  • 硬件: STM32F103RCT6微控制器、RS485、RS232接口、传感器模块

  • 通信协议: Modbus RTU

  • 软件: Qt开发环境

  • 编程语言: C/C++、Qt

二、系统架构

系统架构设计

本系统由三个主要部分组成:传感器、数据采集模块和上位机。系统架构的设计如下图所示:

数据采集
RS485
数据处理
限位报警
状态判断
故障监测
传感器
数据采集模块
上位机
用户界面
报警模块
状态监测模块
故障检测模块

系统组件选择

  1. 单片机: 选用STM32F103RCT6微控制器,具有高性能和丰富的外设接口,适合复杂的数据采集任务。

  2. 通信协议: 采用RS485接口,以Modbus RTU协议进行数据通信,适合长距离和多点通信,确保数据的完整性和可靠性。

  3. 传感器: 选择温度、湿度、气体等多种传感器,能够满足不同环境监测需求。

  4. 上位机软件: 使用Qt开发环境,提供直观的用户交互界面,支持实时数据显示和历史数据分析。

三、环境搭建和注意事项

环境搭建

  1. 硬件环境:

    • STM32开发板(如STM32F103RCT6)

    • RS485转USB模块

    • 各类传感器(如DHT11、MQ系列气体传感器等)

  2. 软件环境:

    • 安装STM32CubeIDE或Keil进行固件开发。

    • 安装Qt Creator,配置Qt环境以进行上位机软件开发。

注意事项

  • 电源管理: 确保电源电压稳定,避免对微控制器和传感器造成损害。

  • RS485通信: 在RS485通信中,确保信号的正确连接和终端电阻的匹配,以防止信号反射和干扰。

  • 数据传输稳定性: 在长距离通信时,注意数据线的屏蔽和布线,以提高抗干扰能力。

四、代码实现过程

为了实现基于STM32的传感器数据采集系统,我们需要按照系统架构设计逐步实现各个功能模块。以下将详细介绍数据采集模块和上位机模块的代码实现过程,包括系统初始化、数据采集、数据传输、界面设计等方面。

4.1 数据采集模块实现

4.1.1 系统初始化

在STM32F103RCT6微控制器中,首先需要进行系统的初始化,包括时钟配置、GPIO初始化和UART配置。以下是系统初始化的代码示例:

#include "stm32f10x.h"void SystemClock_Config(void);
void GPIO_Config(void);
void UART_Config(void);int main(void) {HAL_Init();                // 初始化HAL库SystemClock_Config();      // 配置系统时钟GPIO_Config();             // 初始化GPIOUART_Config();             // 配置UARTwhile (1) {CollectSensorData();    // 采集传感器数据HAL_Delay(1000);        // 每秒采集一次}
}

4.1.2 GPIO配置

在数据采集模块中,GPIO配置用于控制RS485的发送和接收模式。以下是GPIO配置的代码示例:

void GPIO_Config(void) {__HAL_RCC_GPIOA_CLK_ENABLE();  // 使能GPIOA时钟GPIO_InitTypeDef GPIO_InitStruct = {0};// 配置RS485 DE引脚为输出GPIO_InitStruct.Pin = GPIO_PIN_1; // 假设DE连接在PA1GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

4.1.3 UART配置

UART配置用于RS485通信,设置波特率和数据格式。以下是UART配置的代码示例:

void UART_Config(void) {__HAL_RCC_USART1_CLK_ENABLE();  // 使能USART1时钟UART_HandleTypeDef huart1;huart1.Instance = USART1;huart1.Init.BaudRate = 9600;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK) {// 初始化失败,处理错误Error_Handler();}
}

4.1.4 传感器数据采集

在数据采集模块中,我们需要实现从传感器读取数据的功能。以下是读取温度和湿度传感器数据的示例代码:

void ReadTemperature(uint8_t *data) {// 假设使用某种传感器读取温度// 这里应实现具体的传感器读取逻辑data[0] = 25; // 示例:读取到的温度值
}void ReadHumidity(uint8_t *data) {// 假设使用某种传感器读取湿度// 这里应实现具体的传感器读取逻辑data[1] = 60; // 示例:读取到的湿度值
}void CollectSensorData() {uint8_t sensorData[10];ReadTemperature(sensorData);ReadHumidity(sensorData + 1);// 发送数据到上位机RS485_SendData(sensorData, sizeof(sensorData));
}

4.1.5 RS485数据发送

RS485通信需要在发送数据前控制DE引脚的状态。以下是数据发送的代码示例:

void RS485_SendData(uint8_t *data, uint16_t length) {// 控制DE引脚为高电平,设置为发送模式HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);// 发送数据到上位机HAL_UART_Transmit(&huart1, data, length, HAL_MAX_DELAY);// 控制DE引脚为低电平,设置为接收模式HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
}

4.2 上位机模块实现

上位机模块负责接收来自数据采集模块的数据,并在用户界面上实时显示这些数据。以下将详细介绍上位机模块的关键实现步骤,包括Qt界面的设计、数据接收与解析、数据展示等。

4.2.1 Qt环境配置

首先,需要在计算机上安装Qt SDK,并创建一个新的Qt Widgets应用程序项目。确保在项目设置中选择适当的Qt版本,并配置好编译环境。

4.2.2 界面设计

在Qt Creator中,可以使用Qt Designer工具设计用户界面。以下是一个简单的界面设计步骤:

  1. 创建主窗口: 在Qt Designer中创建一个QMainWindow,命名为MainWindow

  2. 添加控件: 在主窗口中添加以下控件:

  • QLabel: 显示温度和湿度信息。

  • QPushButton: 用于开始和停止数据接收。

  • QTableWidget: 显示历史数据。

  • QTextEdit: 用于显示日志信息。

设计完成后,将界面保存。

4.2.3 代码实现

MainWindow类中,编写数据接收和显示的逻辑。以下是关键代码部分的实现:

#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QTimer>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void readSerialData(); // 读取串口数据void startReceiving();  // 开始接收数据void stopReceiving();   // 停止接收数据private:QSerialPort *serial;    // 串口对象QLabel *temperatureLabel; // 温度标签QLabel *humidityLabel;    // 湿度标签QTableWidget *dataTable;  // 数据表格
};MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), serial(new QSerialPort(this)) {// 界面初始化setupUi(this);// 配置串口serial->setPortName("COM3"); // 设置串口名称serial->setBaudRate(QSerialPort::Baud9600);// 连接信号和槽connect(serial, &QSerialPort::readyRead, this, &MainWindow::readSerialData);
}MainWindow::~MainWindow() {if (serial->isOpen()) {serial->close();}
}void MainWindow::startReceiving() {if (serial->open(QIODevice::ReadOnly)) {// 启动接收数据qDebug() << "串口已打开";} else {qDebug() << "无法打开串口";}
}void MainWindow::stopReceiving() {if (serial->isOpen()) {serial->close();qDebug() << "串口已关闭";}
}void MainWindow::readSerialData() {while (serial->canReadLine()) {QString line = serial->readLine();QStringList sensorData = line.split(',');if (sensorData.size() >= 2) {// 更新温度和湿度标签temperatureLabel->setText("温度: " + sensorData[0] + " °C");humidityLabel->setText("湿度: " + sensorData[1] + " %");// 在数据表格中记录历史数据int rowCount = dataTable->rowCount();dataTable->insertRow(rowCount);dataTable->setItem(rowCount, 0, new QTableWidgetItem(sensorData[0]));dataTable->setItem(rowCount, 1, new QTableWidgetItem(sensorData[1]));}}
}

4.2.5 故障监测与报警功能

在上位机中,我们可以实现一个简单的故障监测机制,以便在传感器数据超过设定阈值时发出警报。以下是监测函数的完整实现代码。

void MainWindow::checkForAlerts(double temperature, double humidity) {QString alertMessage;// 检查温度是否超过警戒线if (temperature > 30.0) {alertMessage += "警报:温度超过30°C!\n";}// 检查湿度是否超过警戒线if (humidity > 80.0) {alertMessage += "警报:湿度超过80%!\n";}// 如果有警报信息,显示在文本框中if (!alertMessage.isEmpty()) {QTextEdit *logTextEdit = findChild<QTextEdit *>("logTextEdit");if (logTextEdit) {logTextEdit->append(alertMessage);}}
}

readSerialData函数中调用checkForAlerts,以便在接收到数据后立即检查是否存在报警情况:

void MainWindow::readSerialData() {while (serial->canReadLine()) {QString line = serial->readLine();QStringList sensorData = line.split(',');if (sensorData.size() >= 2) {// 更新温度和湿度标签double temperature = sensorData[0].toDouble();double humidity = sensorData[1].toDouble();temperatureLabel->setText("温度: " + QString::number(temperature, 'f', 2) + " °C");humidityLabel->setText("湿度: " + QString::number(humidity, 'f', 2) + " %");// 调用报警检查函数checkForAlerts(temperature, humidity);// 在数据表格中记录历史数据int rowCount = dataTable->rowCount();dataTable->insertRow(rowCount);dataTable->setItem(rowCount, 0, new QTableWidgetItem(QString::number(temperature)));dataTable->setItem(rowCount, 1, new QTableWidgetItem(QString::number(humidity)));}}
}

在适当的时机(例如在关闭程序时)调用saveDataToFile函数,以确保数据被保存。

4.2.7 主函数

最后,确保在主函数中创建并显示主窗口,同时设置接收数据的启动和停止事件。

int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow window;// 开始接收数据window.startReceiving();window.show();return app.exec();
}

4.3 整体系统流程

4.3.1 数据采集流程

  1. 系统启动: STM32微控制器初始化,配置时钟、GPIO和UART。

  2. 传感器数据采集: 定时采集传感器数据,读取温度和湿度信息。

  3. 数据传输: 通过RS485接口将采集到的数据发送给上位机,采用Modbus RTU协议格式化数据。

  4. 数据发送: 控制RS485的发送和接收模式,确保数据的完整性。

4.3.2 上位机数据处理流程

  1. 串口配置: 打开指定的串口,设置波特率和数据格式。

  2. 数据接收: 接收来自STM32的数据并解析。

  3. 数据展示: 实时更新界面上的数据标签,显示温度和湿度值。同时,将历史数据保存到数据表格中,以供后续查询与分析。

  4. 故障监测与报警: 在每次接收数据时,调用监测函数检查温度和湿度是否超出设定阈值。如果超出,则在日志框中打印警报信息,提示用户注意。

  5. 数据持久化: 在适当的时机(例如用户点击“保存”按钮或关闭软件时),将历史数据写入CSV文件,便于后续查看和分析。

4.3.3 整体系统工作流程图

用户 上位机 STM32微控制器 传感器 启动上位机软件 打开串口 确认串口打开 采集传感器数据 返回温度、湿度数据 发送数据(温度, 湿度) loop [数据采集与发送] 解析数据 更新界面显示 检查限位 触发报警 显示警报信息 记录正常数据 alt [超出限位] [正常状态] 保存数据 将数据写入文件 关闭串口 用户 上位机 STM32微控制器 传感器

五、项目总结

5.1 项目主要功能

本项目实现了一个基于STM32F103RCT6微控制器的传感器数据采集系统,主要功能包括:

  1. 传感器数据采集: 通过多个传感器(如温度、湿度传感器)实时采集环境数据。

  2. 数据传输: 采用RS485接口与Modbus RTU协议,将采集到的数据实时传送至上位机。

  3. 上位机数据处理: 使用Qt开发环境实现用户界面,实时显示温度、湿度数据,并支持历史数据记录和展示。

  4. 故障监测与报警: 实现对传感器数据的阈值监测,超出设定范围时发出警报,并在界面中记录相关信息。

  5. 数据持久化: 支持将历史数据保存为CSV文件,便于后续分析与查看。

5.2 实现过程总结

该系统的实现过程经历了以下几个阶段:

  • 需求分析与设计: 针对项目需求,设计了系统架构和数据流,并选择了合适的硬件组件和通信协议。

  • 硬件开发: 在STM32开发板上实现了数据采集模块,配置了GPIO、UART和RS485接口,编写了数据采集和发送的代码。

  • 上位机开发: 使用Qt进行上位机软件的开发,设计了用户界面,编写了数据接收、解析及显示的逻辑代码。

  • 系统集成与测试: 将硬件和上位机软件进行集成,进行了系统测试,确保数据的准确性和系统的稳定性。

相关文章:

基于STM32的传感器数据采集系统设计:Qt、RS485、Modbus Rtu协议(代码示例)

一、项目概述 项目目标与用途 本项目旨在设计并实现一个基于STM32F103RCT6微控制器的传感器数据采集系统。该系统通过多个传感器实时监测环境参数&#xff0c;并将采集到的数据传输至上位机进行处理和分析。系统的主要应用领域包括环境监测、工业控制、智能家居等。通过该系统…...

【计网不挂科】计算机网络——<34道经典简述题>特训

前言 大家好吖&#xff0c;欢迎来到 YY 滴计算机网络 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 本博客主要内容&#xff0c;收纳了一部门基本的计算机网络题目&#xff0c;供yy应对期中考试复习。大家可以参考 本章为分章节的习题内容题库&#x…...

Spring Web开发(请求)获取JOSN对象| 获取数据(Header)

大家好&#xff0c;我叫小帅今天我们来继续Spring Boot的内容。 文章目录 1. 获取JSON对象2. 获取URL中参数PathVariable3.上传⽂件RequestPart3. 获取Cookie/Session3.1 获取和设置Cookie3.1.1传统获取Cookie3.1.2简洁获取Cookie 3. 2 获取和存储Session3.2.1获取Session&…...

算法训练营day22(二叉树08:二叉搜索树的最近公共祖先,插入,删除)

第六章 二叉树part08 今日内容&#xff1a; ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点 详细布置 235. 二叉搜索树的最近公共祖先 相对于 二叉树的最近公共祖先 本题就简单一些了&#xff0c;因为 可以利用二叉搜索树的…...

【论文阅读】 Learning to Upsample by Learning to Sample

论文结构目录 一、之前的上采样器二、DySample概述三、不同上采样器比较四、整体架构五、设计过程&#xff08;1&#xff09;初步设计&#xff08;2&#xff09;第一次修改&#xff08;3&#xff09;第二次修改&#xff08;4&#xff09;第三次修改 六、DySample四种变体七、复…...

Android 图形系统之五:Gralloc

Gralloc (Graphics Allocator) 是 Android 系统中的关键组件之一&#xff0c;用于管理图形缓冲区的分配、映射以及处理。在 Android 的图形架构中&#xff0c;Gralloc 充当了 HAL (Hardware Abstraction Layer) 的一部分&#xff0c;为系统和硬件提供了通用的接口&#xff0c;使…...

【大数据学习 | Spark调优篇】Spark之内存调优

1. 内存的花费 1&#xff09;每个Java对象&#xff0c;都有一个对象头&#xff0c;会占用16个字节&#xff0c;主要是包括了一些对象的元信息&#xff0c;比如指向它的类的指针。如果一个对象本身很小&#xff0c;比如就包括了一个int类型的field&#xff0c;那么它的对象头实…...

Spring Data JPA(一) 基础入门

Spring Data JPA&#xff08;一&#xff09; 基础入门 JPA 的全称是 Java Persistence API , 即 Java 持久层 API。Spring Data JPA 是 Spring 生态中提出的一套数据库 ORM &#xff08;对象关系映射&#xff09;规范、抽象标准&#xff0c;或者说它是对ORM框架实现的顶层抽象…...

Flutter | 基于函数式编程的通用单选列表设计

背景 项目中多次用到如下图的通用单选列表页&#xff1a; 常规封装 此列表需要三样东西&#xff1a; 标题数组当前选中项的 index点击 cell 的回调 封装大体如下&#xff1a; import package:flutter/material.dart;class ListPage1 extends StatefulWidget {const ListPa…...

华三防火墙F1000-AK系列策略路由配置案例(WEB)

1 配置需求或说明 1.1 适用的产品系列 本案例适用于如F1000-AK180、F1000-AK170等F1000-AK系列的防火墙。 1.2 配置需求及实现的效果 防火墙作为网络出口设备,外网有移动和联通两条线路。内网有192.168.1.0和192.168.2.0两个网段,需要实现192.168.1.0网段走移动线路,192…...

Oracle 锁表的解决方法及避免锁表问题的最佳实践

背景介绍 在 Oracle 数据库中&#xff0c;锁表或锁超时相信大家都不陌生&#xff0c;是一个常见的问题&#xff0c;尤其是在执行 DML&#xff08;数据操作语言&#xff09;语句时。当一个会话对表或行进行锁定但未提交事务时&#xff0c;其他会话可能会因为等待锁资源而出现超…...

深度学习中的生成对抗网络(GAN)原理与应用

引言 生成对抗网络&#xff08;Generative Adversarial Network&#xff0c;简称GAN&#xff09;是由Ian Goodfellow等人在2014年提出的一种深度学习模型&#xff0c;它通过对抗训练的方式生成与真实数据分布相似的假数据。GAN的出现极大地推动了深度学习和生成模型的研究&…...

Swing中JScrollPane面板

一、介绍 在设置界面时&#xff0c;可能会遇到在一个较小的容器窗体中显示一个较大部分的内容的情况&#xff0c;这时可使用JScrollPane面板。JScrollPane面板是带滚动条的面板&#xff0c;是一种容器&#xff0c;但是JScrollPane只能放置一个组件&#xff0c;并且不可使用布局…...

【学习笔记】检测基于RTOS的设计中的堆栈溢出-第2部分

有许多技术可用于检测堆栈溢出。有些使用硬件,而有些则完全在软件中执行。正如我们很快将看到的那样,在硬件中具有这种能力到目前为止是更可取的,因为堆栈溢出可以在发生时立即检测到,事实上,可以避免,因为硬件实际上可以防止对无效访问的写入。 硬件堆栈溢出检测机制通…...

PHP 函数

在php中有非常多的函数&#xff0c;函数这种东西不需要记全&#xff0c;直到怎么使用就行了&#xff0c;如果想了解多点函数&#xff0c;可以查看php官方函数手册&#xff0c;或者参考菜鸟PHP 5 Array 函数 | 菜鸟教程。 创建 PHP 函数 通常函数创建完毕后是用来调用。 语法格…...

centos更换源文件,换源,替换源

期初怎么折腾就是不行&#xff0c;换了源也是不能使用的&#xff0c;最后发现不是换的源不行&#xff0c;而是之前的源文件不行&#xff0c;然后给所有的源文件在yum源统一放在了bak目录下&#xff0c;随后我们再去下载安装源文件。 您将yum源下载之后&#xff0c;先将您的其他…...

【深度学习】四大图像分类网络之VGGNet

2014年&#xff0c;牛津大学计算机视觉组&#xff08;Visual Geometry Group&#xff09;和Google DeepMind公司一起研发了新的卷积神经网络&#xff0c;并命名为VGGNet。VGGNet是比AlexNet更深的深度卷积神经网络&#xff0c;该模型获得了2014年ILSVRC竞赛的第二名&#xff0c…...

线性表-链式描述(C++)

链式实现的线性表&#xff1a; 链式实现的线性表&#xff0c;即链表&#xff08;Linked List&#xff09;&#xff0c;是一种通过节点&#xff08;Node&#xff09;的集合来存储数据的线性数据结构。在链表中&#xff0c;每个节点包含两部分&#xff1a;存储数据的域&#xff…...

C++高阶算法[汇总]

&#xff08;一&#xff09;高精度算法概述 高精度算法是指能够处理超出常规数据类型表示范围的数值的算法。在 C 中&#xff0c;标准数据类型通常有固定的位数和精度限制&#xff0c;而高精度算法可以解决大数运算、金融计算和科学计算等领域的问题。 &#xff08;二&#x…...

机器学习之DeepMind推出的DreamerV3

开放域任务强化学习(Open-Ended Task Reinforcement Learning)的目标是使智能体能够在多样化且未见过的任务中表现出色,同时能够实现任务间的迁移学习。这类研究的重点在于开发通用的学习算法,能够在没有明确任务定义的情况下,从环境中学习并推广到新任务。DeepMind的Drea…...

【Zookeeper】四,Zookeeper节点类型、通知、仲裁、会话

文章目录 Zookeeper的架构znode的版本Zookeeper的节点类型层级树状结构znode的不同类型 Zookeeper监视与通知通知的类型 Zookeeper的仲裁Zk的会话会话的生命周期 Zookeeper的架构 Zookeeper的服务器端运行两种模式&#xff1a;独立模式&#xff08;standalone&#xff09;和仲…...

Vue 集成和使用 SQLite 的完整指东

1. 引言 SQLite 是一种轻量级的关系型数据库管理系统&#xff0c;以其简单易用、无需服务器等特点广泛应用于嵌入式系统、移动应用和小型应用程序中。在 Web 开发中&#xff0c;尤其是前端应用开发中&#xff0c;SQLite 可以作为客户端本地存储的一种选择&#xff0c;为用户提…...

CMAKE常用命令详解

NDK List基本用法 Get–获取列表中指定索引的元素 list(Get list_name index output_var)解释 list_name: 要操作集合的名称index: 要取得的元素下标output_var: 保存从集合中取得元素的结果 栗子 list(GET mylist 0 first_element) # 获取第一个元素APPEND–在列表末尾…...

【嵌入式——QT】QT制作安装包

第一步 QT程序写好之后&#xff0c;编译release版本 第二步 拿到release生成的.exe文件 第三步 新建文件夹deploy 第四步 将.exe文件复制到deploy目录下 第五步 在该目录下输入cmd指令&#xff0c;回车 第六步 在打开的命令窗口下输入 windeployqt TegNetCom_1.0.…...

JavaScript 前端开发:从入门到精通的奇幻之旅

目录 一、引言 二、JavaScript 基础 &#xff08;一&#xff09;变量与数据类型 &#xff08;二&#xff09;运算符 &#xff08;三&#xff09;控制结构 三、函数 &#xff08;一&#xff09;函数定义与调用 &#xff08;二&#xff09;函数作用域 &#xff08;三&am…...

shell编程基础笔记

目录 echo改字体颜色和字体背景颜色 bash基本功能&#xff1a; 运行方式&#xff1a;推荐使用第二种方法 变量类型 字符串处理&#xff1a; 条件判断&#xff1a;&#xff08;使用echo $?来判断条件结果&#xff0c;0为true&#xff0c;1为false&#xff09; 条件语句&a…...

FPGA实现GTP光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案本博已有的FPGA驱动USB通信方案 3、工程详细设计方案工程设计原理框图输入Sensor之-->OV5640摄像头输入Sensor之-->芯片解码的…...

使用 PDF API 合并 PDF 文件

内容来源&#xff1a; 如何在 Mac 上合并 PDF 文件 1. 注册与认证 您可以注册一个免费的 ComPDFKit API 帐户&#xff0c;该帐户允许您在 30 天内免费无限制地处理 1,000 多个文档。 ComPDFKit API 使用 JSON Web Tokens 方法进行安全身份验证。从控制面板获取您的公钥和密钥&…...

Jenkins Nginx Vue项目自动化部署

目录 一、环境准备 1.1 Jenkins搭建 1.2 NVM和Nodejs安装 1.3 Nginx安装 二、Jenkins配置 2.1 相关插件安装 2.2 全局工具安装 2.3 环境变量配置 2.4 邮箱配置&#xff08;构建后发送邮件&#xff09; 2.5 任务配置 三、Nginx配置 3.1 配置路由转发 四、部署项目 …...

python代码实现问卷星问卷内容获取并写入word文档保存

以下附完整代码。 import os from tkinter import Tk, simpledialog, messagebox from docx import Document import time import requests import re from tkinter import ttk# 使用 tkinter 创建一个简单的输入框来获取用户输入的问卷链接 root Tk() root.title("问卷…...

C# 2024年Visual Studio实用插件集合

在2024年&#xff0c;Visual Studio作为.NET开发者的首选IDE&#xff0c;其插件生态不断壮大&#xff0c;为开发者提供了更高效、便捷的开发体验。本文将介绍一些实用的Visual Studio插件&#xff0c;特别是针对C#开发者&#xff0c;帮助提升开发效率和代码质量。 1. GitHub C…...

基于PHP的香水销售系统的设计与实现

摘 要 时代科技高速发展的背后&#xff0c;也带动了经济的增加&#xff0c;人们对生活质量的要求也不断提高。香水作为一款在人际交往过程中&#xff0c;给对方留下良好地第一印象的产品&#xff0c;在生活中也可以独自享受其为生活带来的点缀。目前香水市场体量庞大&#xff…...

QT去除窗口边框(无边框)

ch21_TencentMeetingLogin::ch21_TencentMeetingLogin(QWidget *parent): QDialog(parent) {ui.setupUi(this);this->setWindowFlags(Qt::FramelessWindowHint);//去除窗口边框 } 但此时窗口不能拖动且点击任务栏程序图标不能最小化&#xff01; this->setWindowFlags(Q…...

【k8s】监控metrics-server

metrics-server介绍 Metrics Server是一个集群范围的资源使用情况的数据聚合器。作为一个应用部署在集群中。Metric server从每个节点上KubeletAPI收集指标&#xff0c;通过Kubernetes聚合器注册在Master APIServer中。为集群提供Node、Pods资源利用率指标。 就像Linux 系统一样…...

「Qt Widget中文示例指南」如何为窗口实现流程布局?(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文将展示如何为不…...

EditInPlace就地编辑:Dom vs Form

利用Dom和Form实现就地编辑&#xff08;EditInPlace&#xff09;功能&#xff0c;两者在实现方式、用户体验和适用场景上有一些区别。下面我将详细解释这些区别&#xff1a; 1. EditInPlace 就地编辑&#xff08;EditInPlace&#xff09;是一种用户界面设计模式&#xff0c;允…...

【SCT63142FIB】15W高集成、高效率的无线功率发射PMIC

SCT63142FIB 15W高集成、高效率的无线功率发射PMIC 描述 SCT63142是一款高度集成的电源管理IC&#xff0c;可实现符合WPC规范的高性能&#xff0c;高效率和成本效益的无线电源发送系统&#xff0c;支持高达15W的功率传输&#xff0c;可与无线应用特定控制器或基于通用MCU的发送…...

STM32F4系列单片机新玩法---Micropython--pyBoard

只需要更改main.py文件的内容即可&#xff0c;例程CRTLV 1、流水灯&#xff1a; # main.py -- put your code here! import pyb while(1): for n in range(1,5) ledpyb.LED(n) led.on() pyb.delay(1000) led.off() 2、灯条,可以改变delay值来凸显效果…...

MFC中如何在工具条动态增加菜单

在C:\temp\VCSamples-master\VC2010Samples\MFC\Visual C 2008 Feature Pack\WordPad 这个例子中倒是有在工具条上动态增加菜单的方法&#xff0c;但有个缺陷&#xff0c;必须预先将需要的按钮定死。现将方法总结如下&#xff1a; 效果如下&#xff1a;点击前&#xff1a; 点击…...

行为型模式-迭代器模式

迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;主要用于提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而不需要暴露其内部表示。这个模式常被用于集合类对象&#xff08;如列表、数组、图等&#xff09;的实现中。 模式结构…...

SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖,Credit/Debit Memo

上一章讲了 请求书&#xff08;发票&#xff09;的取消。 SAP SD学习笔记16 - 请求书的取消 - VF11-CSDN博客 再往上几章&#xff0c;讲了下图里面的返品传票&#xff1a; SAP SD学习笔记14 - 投诉处理1 - 返品处理&#xff08;退货处理&#xff09;的流程以及系统实操&#…...

digit_eye开发记录(3): C语言读取MNIST数据集

在前两篇&#xff0c;我们解读了 MNIST 数据集的 IDX 文件格式&#xff0c;并分别用 C 和 Python 做了 读取 MNIST 数据集的实现。 基于 C 的代码稍长&#xff0c;基于 Python 的代码则明显更短&#xff0c;然而它们的共同特点是&#xff1a;依赖了外部库&#xff1a; 基于 C …...

快速学习GO语言总结

干货分享&#xff0c;感谢您的阅读&#xff01;备注&#xff1a;本博客将自己初步学习GO的总结进行分享&#xff0c;希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力&#xff0c;如有错误请留言指正&#xff0c;谢谢&#xff01; 一、初步了解Go语言 &#xf…...

开源多媒体处理工具ffmpeg是什么?如何安装?使用ffmpeg将M3U8格式转换为MP4

目录 一、FFmpeg是什么二、安装FFmpeg&#xff08;windows&#xff09;三、将M3U8格式转换为MP4格式 一、FFmpeg是什么 FFmpeg是一款非常强大的开源多媒体处理工具&#xff0c;它几乎可以处理所有类型的视频、音频、字幕以及相关的元数据。 FFmpeg的主要用途包括但不限于&…...

Python面试实战:高效处理海量日志,找出高频IP

Python面试实战:高效处理海量日志,找出高频IP 问题描述 在处理海量服务器日志时,一个常见的需求是统计出现次数最多的IP地址。这不仅有助于分析网站访问流量,还能为安全监控提供有价值的信息。然而,当日志文件过大,无法一次性加载到内存时,如何高效地解决这个问题就成…...

基于Java Springboot蛋糕订购小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…...

Java进程为什么会消失

深夜&#xff0c;办公室里只剩下电脑屏幕的微光。小王正在紧张地盯着生产环境的监控面板&#xff0c;突然发现一个重要的Java应用进程不见了&#xff0c;就像人间蒸发一般。这种情况在Java开发中并不罕见&#xff0c;让我们一起走进这个技术探案&#xff0c;揭开Java进程神秘消…...

继上一篇,设置弹框次数以及自适应图片弹框,部分机型(vivo)老手机不显示的问题

上一篇写的本来测试好多型号都无事, 今天下午公司的战斗机vivo横空冒出… 晕 弹框直接显示都出不来了,现在还有用这种老的机型的,但是没办法咯~ 前端遇到这种兼容性的问题就要勇于解决 主要解决了这几点: // 添加图片加载事件 <imgv-if"imageUrl":src"image…...

【docker】容器卷综合讲解,以及go实现的企业案例

容器卷&#xff08;Volumes&#xff09;基础讲解&#xff1a; 容器概念 容器卷&#xff08;Volumes&#xff09;是 Docker 提供的一种持久化存储机制&#xff0c;允许容器持久化数据&#xff0c;即使容器被删除或重新创建&#xff0c;数据仍然可以保留。 卷是独立于容器的&…...

八、利用CSS制作导航栏菜单

8.1 水平顶部导航栏 水平菜单导航栏是网站设计中应用范围最广的导航设计&#xff0c;一般放置在页面的顶部。水平导航适用性强&#xff0c;几乎所有类型的网站都可以使用。 如果导航过于普通&#xff0c;无法容纳复杂的信息结构&#xff0c;就需要在内容模块较多的情况…...