第二个Qt开发实例:在Qt中利用GPIO子系统和sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口(效果为LED2灯的灭和亮)
引言
本文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145420998 里的代码,在那里面代码的基础上添加上利用sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口的代码,进而实现LED2灯的灭和亮。
最终的效果是点击下面的LED按钮实现LED2的灭和亮。
本文使用了GPIO子系统和sysfs伪文件系统去操控GPIO口,
关于GPIO子系统的详细介绍见:https://blog.csdn.net/wenhao_ir/article/details/145444452
关于sysfs伪文件系统的详细介绍见:https://blog.csdn.net/wenhao_ir/article/details/145453877
完整源代码
文件led.h中的代码
#ifndef LED_H
#define LED_Hvoid led_init(void);
void led_control(int on);#endif // LED_H
文件mainwindow.h中的代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
文件led.cpp中的代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <QDebug>void led_init(void)
{/** echo 131 > /sys/class/gpio/export* echo out > /sys/class/gpio/gpio131/direction*/int fd;fd = open("/sys/class/gpio/export", O_WRONLY);if (fd < 0){qDebug()<<"open /sys/class/gpio/export err";return ;}write(fd, "131\n", 4);close(fd);fd = open("/sys/class/gpio/gpio131/direction", O_WRONLY);if (fd < 0){qDebug()<<"open /sys/class/gpio/gpio131/direction err";return ;}write(fd, "out\n", 4);close(fd);
}void led_control(int on)
{/** echo 1 > /sys/class/gpio/gpio131/value* echo 0 > /sys/class/gpio/gpio131/value*/static int fd = -1;if (fd == -1){fd = open("/sys/class/gpio/gpio131/value", O_RDWR);}if (fd < 0){qDebug()<<"open /sys/class/gpio/gpio131/value err";return ;}if (on){write(fd, "0\n", 2);}else{write(fd, "1\n", 2);}
}
文件main.cpp中的代码
#include "mainwindow.h"
#include "led.h"
#include <QApplication>int main(int argc, char *argv[])
{/* 1. init LED */led_init();QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
文件mainwindow.cpp中的代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "led.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{static int status = 1;if (status)qDebug()<<"LED clicked on";elseqDebug()<<"LED clicked off";/* 2. control LED */led_control(status);status = !status;
}
书写LED的初始化函数led_init()
在工程中新建一个名为led.cpp
的文件:
然后在其中写出LED的初始化函数led_init()
。
代码如下:
void led_init(void)
{/** echo 131 > /sys/class/gpio/export* echo out > /sys/class/gpio/gpio131/direction*/int fd;fd = open("/sys/class/gpio/export", O_WRONLY);if (fd < 0){qDebug()<<"open /sys/class/gpio/export err";return ;}write(fd, "131\n", 4);close(fd);fd = open("/sys/class/gpio/gpio131/direction", O_WRONLY);if (fd < 0){qDebug()<<"open /sys/class/gpio/gpio131/direction err";return ;}write(fd, "out\n", 4);close(fd);
}
上面这段代码如果把下面两篇博文:
https://blog.csdn.net/wenhao_ir/article/details/145444452
https://blog.csdn.net/wenhao_ir/article/details/145453877
认真看了一遍,那就很好理解了,所以这里就不再赘述。
如果时间紧的话,那就看:
第1篇博文中的“终端中如何利用GPIO子系统(gpiolib)操作GPIO口”
第2篇博文中的第1个标题中的内容。
不过强烈建议把两篇博文浏览一遍。
另外,关于文件描述符的相关知识,可以参考我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/144931005
这里附一张下面这条命令运行结果:
注意,上面截图中的gpio131
是运行了下面这条代码后才有的:
write(fd, "131\n", 4);
具体的过程我在博文 https://blog.csdn.net/wenhao_ir/article/details/145453877 中有描述,打开博文搜索“请求使用 GPIO 131”
书写LED的控制函数led_control()
在文件led.cpp
里书写LED的控制函数led_control()
,代码如下:
void led_control(int on)
{/** echo 1 > /sys/class/gpio/gpio131/value* echo 0 > /sys/class/gpio/gpio131/value*/static int fd = -1;if (fd == -1){fd = open("/sys/class/gpio/gpio131/value", O_RDWR);}if (fd < 0){qDebug()<<"open /sys/class/gpio/gpio131/value err";return ;}if (on){write(fd, "0\n", 2);}else{write(fd, "1\n", 2);}
}
如果理解了初始化函数led_init()
里的代码,那么这段代码也就很简单了,这里就不再赘述了。
这里附一张下面这条命令运行结果:
注意,上面截图中的gpio131
是运行了下面这条代码后才有的:
write(fd, "131\n", 4);
具体的过程我在博文 https://blog.csdn.net/wenhao_ir/article/details/145453877 中有描述,打开博文搜索“请求使用 GPIO 131”
解决led.cpp
因缺少头文件而导致的各种报错
上面的函数led_init()
和led_control()
写到文件led.cpp
后,会有很多报错:
这些报错本质上都是因为工程的代码编辑器没有正确设置头文件目录,具体的设置方法见 https://blog.csdn.net/wenhao_ir/article/details/145479279
注意:这些报错只是代码编辑器的报错,并不是编译时的报错,我实测过,不解决这个问题,也能成功编译,因为Makefile中有相关的路径设置。
新建头文件led.h
并书写头文件的内容
初始化函数led_init()
和控制函数led_control()
已经写完了,接下来我们要写个头文件对这两个函数声明,以便其它文件中的代码能引用这两个函数。
写入led.h
的代码如下:
#ifndef LED_H
#define LED_Hvoid led_init(void);
void led_control(int on);#endif // LED_H
main函数里调用初始化函数led_init()
类MainWindow的成员函数on_pushButton_clicked
里调用控制函数led_control()
代码如下:
void MainWindow::on_pushButton_clicked()
{static int status = 1;if (status)qDebug()<<"LED clicked on";elseqDebug()<<"LED clicked off";/* 2. control LED */led_control(status);status = !status;
}
这段代码很简单,没啥好说的。
值得注意的是哪里与按钮事件联结起来的?这涉及到Qt的信号槽机制,就是下面这些东西:
上面红框中的东西我已经在博文 https://blog.csdn.net/wenhao_ir/article/details/145420998 中介绍过了,这里就不再赘述了。
编译工程
编译方法
成功编译,顺利生成ELF可执行文件:test_01
把生成的这个ELF可执行文件test_01
复制到NFS网络文件目录中,备用。
这里要说明下,其实在 led.cpp
中,用到了Linux系统的很多用户空间的函数,但是似乎我在配置QtCreator
时没有去配置用户空间编译时需要的头文件和库呀,配置QtCreator
的博文链接 https://blog.csdn.net/wenhao_ir/article/details/145367198
那是怎么回事呢?其实只要有sysroot位置就能有这些需要的头文件和库,关于sysroot的详细介绍,见 https://blog.csdn.net/wenhao_ir/article/details/145468785
这里QtCreator
能根据qmake的位置找到sysroot的位置,所以自然就能编译啦。
我们查看QtCreator
工程中的Makefile文件:
能发现sysroot的路径为:
/home/book/100ask_imx6ull-sdk/Buildroot_2020.02.x/output/host/arm-buildroot-linux-gnueabihf/sysroot
如下图所示:
所以是能正确构建的。
重要概念:Qt程序是运行于用户空间的
这里要注意:其实Qt工程中的代码都是运行于用户空间的,Qt本身就是在用户空间运行的程序,所以只需要提供sysroot,就能正常编译啦。
上板测试
复制可执行文件到NFS网络文件目录
把之前编译生成个ELF可执行文件test_01
复制到NFS网络文件目录中。
打开串口终端→打开开发板→挂载网络文件系统:
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
关掉开发板上自带的QT的GUI
经实测,如果不关闭开发板自带的QT的GUI,虽然你自己写的Qt界面能加载出来,但是当你用手划动屏幕时,开发板上自带的QT的GUI有可能会弹出来。
参考博文 https://blog.csdn.net/wenhao_ir/article/details/144591685 用一次性有效的方法(即不是永久有效的方法)关掉自带的QT的GUI界面。
这里用一次性的方法,即不是永久有效的方法:
执行下面这条命令:
/etc/init.d/S99myirhmi2 stop
执行完成后再用手去操作屏幕上的UI界面,UI界面就没有任何反应了,说明QT的GUI界面被关掉了
设置Qt环境变量
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
export QT_QPA_FONTDIR=/usr/lib/fonts/
这三条命令的详细解释见 https://blog.csdn.net/wenhao_ir/article/details/145433648
运行编译生成的Qt程序
注意:运行前请确保Qt运行的环境变量设置好了。
注意:运行前请确保Qt运行的环境变量设置好了。
/mnt/qt_sys_led/test_01
屏幕如下图所示:
点击LED按钮1次:
终端运行结果如下:
此时LED2灯是亮着的。
再点LED按钮1次:
终端运行结果如下:
此是LED2灯灭了。
这样测试就成功了。
附编译完成后完整的工程目录
https://pan.baidu.com/s/1j7DVGZaZj0WtK3J-K2xnsQ?pwd=h5sp
注意:QtCreator的工程换位置后一定要更换一下Build directory的位置,因为在QtCreator中Build directory是一个绝对路径,详情见 https://blog.csdn.net/wenhao_ir/article/details/145458743
相关文章:
第二个Qt开发实例:在Qt中利用GPIO子系统和sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口(效果为LED2灯的灭和亮)
引言 本文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145420998 里的代码,在那里面代码的基础上添加上利用sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口的代码,进而实现LED2灯的灭和亮。 最终的效果是点击下面的LED按钮实现LED…...
【自动化测试】使用Python selenium类库模拟手人工操作网页
使用Python selenium类库模拟手人工操作网页 背景准备工作安装Python版本安装selenium类库下载selenium驱动配置本地环境变量 自动化脚本输出页面表单自动化填充相关代码 背景 待操作网页必须使用IE浏览器登录访问用户本地只有edge浏览器,通过edge浏览器IE模式访问…...
Elasticsearch:向量搜索的快速介绍
作者:来自 Elastic Valentin Crettaz 本文是三篇系列文章中的第一篇,将深入探讨向量搜索(也称为语义搜索)的复杂性,以及它在 Elasticsearch 中的实现方式。 本文是三篇系列文章中的第一篇,将深入探讨向量搜…...
低至3折,百度智能云千帆宣布全面支持DeepSeek-R1/V3调用
DeepSeek-R1和 DeepSeek-V3模型已在百度智能云千帆平台上架 。 出品|产业家 新年伊始,百度智能云又传来新动作 。 2月3日百度智能云宣布, DeepSeek-R1和 DeepSeek-V3模型已在百度智能云千帆平台上架,同步推出超低价格方案,并…...
VSCode中使用EmmyLua插件对Unity的tolua断点调试
一.VSCode中搜索安装EmmyLua插件 二.创建和编辑launch.json文件 初始的launch.json是这样的 手动编辑加上一段内容如下图所示: 三.启动调试模式,并选择附加的进程...
RabbitMQ 从入门到精通:从工作模式到集群部署实战(三)
文章目录 使用CLI管理RabbitMQrabbitmqctlrabbitmq-queuesrabbitmq-diagnosticsrabbitmq-pluginsrabbitmq-streamsrabbitmq-upgraderabbitmqadmin 使用CLI管理RabbitMQ RabbitMQ CLI 工具需要安装兼容的 Erlang/OTP版本。 这些工具假定系统区域设置为 UTF-8(例如en…...
2025软件授权与保护领域的新趋势
2024年对威步而言是一个重要的里程碑——公司成立35年以来,一直专注于软件安全及软件授权管理,以保护企业的数字资产与知识产权。展望2025年,数字资产盗窃、数据泄露与网络犯罪等威胁仍在持续增长,威步将在新的形势下继续推动技术…...
线段树(点修,区查,区修)
文章目录 什么是线段树?线段树能够解决什么样的问题?模板 什么是线段树? 线段树是一种二叉搜索树,而二叉搜索树,首先满足二叉树,即每个结点最多有两颗子树,并且是一颗搜索树,我们要知…...
深度学习 - 神经网络的原理
## 深度学习 - 神经网络的原理 深度学习是机器学习的一个分支,其核心是模拟人脑神经网络的结构和功能,构建多层的神经网络模型,从数据中学习特征并进行预测或分类。 **神经网络的基本原理:** 1. **神经元模型:** * 神经网…...
DeepSeek辅助段落扩写的能力怎么样?
DeepSeek-R1在学术写作的诸多细节层面展现出了显著的应用价值。接下来我们将通过一系列具体案例,深入探讨该工具如何在扩写、翻译、发表以及内容改进等关键环节为学术写作提供有力支持。在提问环节,DeepSeek-R1能够高效地简化提示词,并精准地…...
深入Linux系列之进程地址空间
深入Linux系列之进程地址空间 1.引入 那么在之前的学习中,我们知道我们创建一个子进程的话,我们可以在代码层面调用fork函数来创建我们的子进程,那么fork函数的返回值根据我们当前所处进程的上下文是返回不同的值,它在父进程中返…...
虚拟DOM与Diff算法:Vue如何高效更新UI?
虚拟DOM与Diff算法:Vue如何高效更新UI? 虚拟DOM与Diff算法:Vue如何高效更新UI?什么是虚拟DOM?定义虚拟DOM的优势 Diff算法:如何高效计算UI差异定义核心思想Diff算法的步骤示例代码 Vue中的虚拟DOM与Diff算法…...
Golang 并发机制-6:掌握优雅的错误处理艺术
并发编程可能是提高软件系统效率和响应能力的一种强有力的技术。它允许多个工作负载同时运行,充分利用现代多核cpu。然而,巨大的能力带来巨大的责任,良好的错误管理是并发编程的主要任务之一。 并发代码的复杂性 并发编程增加了顺序程序所不…...
【MySQL】第二弹---数据库基础全解析:从概念到实践的深度探索
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】 目录 1. 数据库基础 1.1 什么是数据库 1.2 主流数据库 1.3 基本使用 1.3.1 MySQL安装 1.3.2 连接服务器 1.3.3 服务器…...
c++计算机教程
目的 做出-*/%计算机 要求 做出可以计算-*/%的计算机 实现 完整代码 #include<bits/stdc.h> int main() {std::cout<<"加 减- 乘* 除/ 取余% \没有了|(因为可以算三位)"<<"\n"<<"提示:每打完一个符号或打完一个数,\…...
win32汇编环境,对话框程序中自定义工具栏的使用示例三
;运行效果 ;win32汇编环境,对话框程序中自定义工具栏的使用示例三 ;这次是竖着的,以下为生成48*48大小的自定义工具栏图标,自已设计图标样式,显得更专业点。 ;原理是,先生成工具栏控件,再生成图像列表,然后弄几个图标加入图像列表,再把图像列表与工具栏控件关联。需留意…...
集合类不安全问题
ArrayList不是线程安全类,在多线程同时写的情况下,会抛出java.util.ConcurrentModificationException异常 解决办法: 1.使用Vector(ArrayList所有方法加synchronized,太重) 2.使用Collections.synchronized…...
怎么使用Cursor以及升级Cursor pro会员
什么是cursor Cursor:结合AI技术的代码编辑器,助力开发者提升编码效率与质量。作为Visual Studio Code的一个衍生版本,Cursor继承了其用户熟知的界面和插件兼容性,并加入了革命性的AI特性。这款编辑器自2023年1月推出以来&#x…...
启用gui,启动图形化界面
1、停止服务 2、开启maxscale GUI ,修改主配置文件(增加框框内两行) 3、启动服务 注:如果出现以下启动不成功 考虑权限问题 4、访问http://ip:8989 用户名/密码:admin/mariadb...
03-移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: 更改…...
LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab)
代码下载:LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab) LSSVM最小二乘支持向量机多变量多步光伏功率预测 一、引言 1.1、研究背景与意义 随着全球能源危机和环境问题的日益严重,可再生能源的开发利用成为了世界各国…...
使用Vue开发可复用的Web Components:跨框架组件封装指南
使用Vue开发可复用的Web Components:跨框架组件封装指南 使用Vue开发可复用的Web Components:跨框架组件封装指南引言什么是Web Components?为什么选择Vue开发Web Components? 封装跨框架组件的步骤1. 创建基本的Vue组件2. 将Vue组…...
用AI写游戏1——js实现贪吃蛇
使用模型通义千问 提示词: 用js html css 做一个贪吃蛇的动画 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Snake Game</title><link rel"stylesheet" href"c…...
星闪开发入门级教程之安装编译器与小项目烧录
系列文章目录 星闪开发入门级教程 好久不见,已经好几年没有发文章了,星闪-作为中国原生的新一代近距离无线联接技术品牌。我想着写点东西。为了适合新手,绝对小白文。 文章目录 系列文章目录前言一、Hispark Studio1.安装Hispark Studio2.安…...
java求职学习day32
JavaScript 详解 课程目标: 1 、 JavaScript 介绍 2 、 HTML 和 JavaScript 结合方式 3 、 JavaScript 的使用 4 、 DOM 操作 5 、 BOM 操作 1. JavaScript介绍 (1)虽然是 java 作为前缀,但 java 和 javascript 的关系,就像老婆和老婆…...
【Markdown语法】锚点机制:跳转任意位置
最近写文章时,发现有一个需求:想要实现一种点击跳转到文档中任意位置的功能,这就是锚点机制,就像游戏中的传送锚点,于是写成文章记录一下使用方式。 本文将详细介绍如何使用Markdown创建文档内部跳转(即锚…...
Docker安装pypiserver私服
Docker安装pypiserver私服 1 简介 Python开源包管理工具有pypiserver、devpi和Nexus等,pypiserver安装部署比较简单,性能也不错。 搭建pypiserver私服,可以自己构建镜像,也可以使用官网的docker镜像。 # Github地址 https://g…...
基于微信小程序的居住证申报系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
网站改HTTPS方法
默认的网站建设好后打开的样子那看起来像是钓鱼网站,现在的浏览器特别只能,就是你新买来的电脑默认的浏览器同样也会出现这样“不安全”提示。 传输协议启动了向全球用户安全传输网页内容的流程。然而,随着HTTPS的推出,传输协议通…...
什么是三层交换技术?与二层有什么区别?
什么是三层交换技术?让你的网络飞起来! 一. 什么是三层交换技术?二. 工作原理三. 优点四. 应用场景五. 总结 前言 点个免费的赞和关注,有错误的地方请指出,看个人主页有惊喜。 作者:神的孩子都在歌唱 大家好…...
极客说|利用 Azure AI Agent Service 创建自定义 VS Code Chat participant
作者:卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏,我们邀请来自微软以及技术社区专家,带来最前沿的技术干货与实践经验。在这里,您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&a…...
Rust语言进阶之标准输入: stdin用法实例(一百零五)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...
力扣刷题思路
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言递归70. 爬楼梯112. 路径总和509. 斐波那契数 分治169. 多数元素240.搜索二维矩阵 II --- 二分查找 单调栈 ---「找最近一个比当前值大/小」的问题739. 每日温度…...
MUX-VLAN实验
一、搭建实验拓扑图 二、基本设备配置 设备接口IP地址子网掩码网关PC1E0/0/110.0.1.1255.255.255.0N/APC2E0/0/110.0.1.2255.255.255.0N/APC3E0/0/110.0.1.3255.255.255.0N/APC4E0/0/110.0.1.4255.255.255.0N/APC5E0/0/110.0.1.6255.255.255.0N/Aserver-1E0/0/110.0.1.5255.2…...
音频进阶学习十二——Z变换
文章目录 前言一、Z变换1.Z变换的作用2.Z变换公式3.Z的状态表示1) r 1 r1 r12) 0 < r < 1 0<r<1 0<r<13) r > 1 r>1 r>1 4.关于Z的解释 二、收敛域1.收敛域的定义2.收敛域的表示方式3.ROC的分析1)当 …...
理解推理型大语言模型
构建和改进推理模型的方法与策略 本文描述了构建推理模型的四种主要方法,以及我们如何增强大型语言模型(LLM)的推理能力。我希望这能为你提供有价值的见解,并帮助你了解这一领域快速发展的文献和热潮。 在2024年,LLM…...
【Brinson 绩效归因模型】
Brinson 绩效归因模型 1、前言2、Brinson模型介绍2.1 归因方式2.1.1 BHB 超额收益分解方案2.1.2 BF 超额收益分解方案 2.2 多期 Brinson 模型 1、前言 如此之多的基金,收益率各有不同,即使同等收益率的基金也各有不同的成因。在这种形势下,广…...
如何轻松将Matlab生成的图表嵌入PowerPoint演示文稿
文章目录 Matlab将生成的图添加PPT中一、Matlab脚本1.添加图片函数2.使用示例 总结 Matlab将生成的图添加PPT中 在许多科学、工程和商业领域,Matlab作为一款强大的数值计算和可视化工具,被广泛应用于数据分析和模型构建。然而,当涉及到分享这…...
组合(力扣77)
从这道题开始,我们正式进入回溯算法的学习。之前在二叉树中只是接触到了一丢丢,而这里我们将使用回溯算法解决很多经典问题。 那么这道题是如何使用回溯算法的呢?在讲回溯之前,先说明一下此题是如何递归的。毕竟回溯递归不分家&a…...
2.7学习
crypto buu-还原大师 仔细阅读题目,这里有一段字符串,但是其中有四个大写字母被替换成了‘?’,那么我们写脚本:首先将四个问号均换成26个大写字母并且组成不同的组合, 所以有四个循环让四个问号都遍历26个…...
[开源/教程]使用Ollama+ESP32实现本地对话助手(可接入deepseek等模型)
[开源/视频教程]使用OllamaESP32实现本地对话助手(可接入deepseek等模型) 简介 使用ollama实现本地模型的定制, 可以做到数据不泄露以及绕开检测的效果, 之后使用嘉立创的esp32开发板实现简单的对话助手 同时接入本文档, 可以直接使用AI对话的方式进行文档处理 XuSenfeng/ai…...
Swagger2 自定义排序
分享一下SpringSwagger2在线文档自定义排序的代码。 这里参考swagger2 接口排序_swagger接口排序-CSDN博客提供的思路,并在此基础上做了优化。 1、引用pom信息 <!--swagger依赖(pojo注解)--><dependency><groupId>io.swagger</groupId>&l…...
sentinel的限流原理
Sentinel 的限流原理基于 流量统计 和 流量控制策略,通过动态规则对系统资源进行保护。其核心设计包括以下几个关键点: 流量统计模型:滑动时间窗口 Sentinel 使用 滑动时间窗口算法 统计单位时间内的请求量,相比传统的固定时间窗…...
Mac 部署Ollama + OpenWebUI完全指南
文章目录 💻 环境说明🛠️ Ollama安装配置1. 安装[Ollama](https://github.com/ollama/ollama)2. 启动Ollama3. 模型存储位置4. 配置 Ollama 🌐 OpenWebUI部署1. 安装Docker2. 部署[OpenWebUI](https://www.openwebui.com/)(可视化…...
C/C++ 面试智能指针
说下你对智能指针的理解 回答1: 因为C使用内存的时候很容易出现野指针、悬空指针、内存泄露的问题。所以C11引入了智能指针来管理内存。有四种: auto_ptr:已经不用了unique_ptr:独占式指针,同一时刻只能有一个指针指向同一个对…...
Halcon缓存?内存泄漏?
目录 1、前言 2、图片缓存 3、全局内存缓存 4、临时内存缓存 5、处理 HALCON 中的疑似内存泄漏 6、其他 1、前言 除⾮必要,否则不建议修改 HALCON 自带的缓存设置。 2、图片缓存 图像通常需要大量内存,而分配大块内存的过程较慢。因此,当释放图像时,HALCON并…...
升级 SpringBoot3 全项目讲解 — 周边店铺展示功能如何实现
学会这款 🔥全新设计的 Java 脚手架 ,从此面试不再怕! 1. 升级 Spring Boot 到 3.x 在升级 Spring Boot 之前,我们需要确保项目的依赖和配置与新版本兼容。以下是升级的主要步骤: 1.1 更新 pom.xml 文件 首先&#…...
Git(分布式版本控制系统)系统学习笔记【并利用腾讯云的CODING和Windows上的Git工具来实操】
Git的概要介绍 1️⃣ Git 是什么? Git 是一个 分布式版本控制系统(DVCS),用于跟踪代码的变更、协作开发和管理项目历史。 由 Linus Torvalds(Linux 之父)在 2005 年开发,主要用于 代码管理。…...
光学和光子学模拟工具在 AR/VR 中的作用
AR/VR 中的光学和光子学 增强现实 (AR) 和虚拟现实 (VR) 站在数字进化的前沿。光学和光子学这一复杂的科学深入研究了光的产生、检测和操控,在这一转变中发挥着至关重要的作用。 图 1 (a) 展示了 AR 系统的设计,强调了光学的关键作用。该图描绘了光的旅…...
大模型产品Deepseek(四)、本地安装部署(Ollama方式)
Ollama与DeepSeek的本地安装与部署教程(Windows/MacOS) 在许多AI应用场景中,您可能希望将智能模型本地化,以便更高效地处理数据并减少对外部云服务的依赖。本文将介绍如何在Windows和macOS上直接安装和配置Ollama,以及如何基于Ollama平台部署DeepSeek模型并进行本地交互。…...