- 博客(81)
- 收藏
- 关注
原创 第一个工具:GMSSH推荐
GMSSH(全称:Graphical Management over SSH)是一款基于SSH 协议的纯前端、免安装、可视化服务器管理工具。它不需要在你的服务器上部署任何 Agent 或后台程序,只需通过浏览器连接 SSH,就能获得一个类 Windows 桌面的操作环境。你不用再背命令,点点鼠标就能管理服务器。注册入口:https://www.gm.cn/?我们尊重命令行的强大,但效率不该以学习成本为代价。用现代交互方式重构传统运维体验。它不是要取代 SSH,而是让 SSH 更好用。
2026-01-27 20:51:25
1169
原创 STM32中使用三极管驱动风扇
摘要:本文介绍了三极管的结构原理及STM32驱动代码实现。三极管分为NPN和PNP型,通过小电流控制大电流实现放大功能。文中提供了使用STM32F103C8T6驱动S8050三极管控制风扇的完整代码方案,包括头文件定义、PWM初始化函数和速度控制函数。硬件连接部分强调了三极管引脚识别和电路连接要点,实现了0-100%无级调速功能。该方案展示了如何通过STM32定时器的PWM输出来精确控制三极管驱动风扇转速。
2025-11-03 21:04:10
1122
原创 WSL2中使用GUI界面
WSL2运行ROS2图形界面完整流程 启动XLaunch:安装VcXsrv,勾选"Disable access control",启动XServer。 配置WSL:在WSL终端设置环境变量: export DISPLAY=$(awk '/nameserver/{print $2;exit}' /etc/resolv.conf):0 export LIBGL_ALWAYS_INDIRECT=1 安装依赖库:首次需安装X11和OpenGL相关库。 运行ROS2 GUI: ros2 run t
2025-10-18 11:26:25
1988
原创 Ubuntu22.04安装Ibus的中文输入法
摘要:本文介绍了在Ubuntu系统下使用IBUS框架配置中文输入法的完整步骤。首先在系统设置中安装中文语言并选择IBUS框架,然后通过终端安装ibus-libpinyin包。接着运行ibus-setup添加智能拼音输入法,最后重启系统即可使用。若遇到输入法图标消失问题,可通过运行ibus-daemon-drx命令重启IBUS服务解决。该方法基于IBUS框架,因其在Ubuntu系统中的兼容性优于Fcitx。
2025-10-11 21:00:59
1138
原创 类模板成员函数如何分文件编写
摘要:本文介绍了类模板分文件编写时遇到的链接问题及两种解决方案:1)直接包含.cpp源文件;2)将声明和实现合并为.hpp文件(主流做法)。同时讲解了类模板与友元函数的两种实现方式:类内实现(直接声明友元)和类外实现(需提前声明函数模板)。通过示例代码展示了Person类模板的成员函数实现和友元函数的类内/外实现方法,以及调用时的注意事项。
2025-09-21 14:00:00
363
原创 类模板的创建与使用
摘要: 本文介绍了C++类模板的语法特性与使用要点。类模板通过template<typename T>声明,允许成员使用通用数据类型。与函数模板相比,类模板不支持自动类型推导,但支持默认参数(如template<class T1, class T2=int>)。成员函数在调用时才会创建,避免无效编译。类模板对象作为函数参数有三种传递方式:显式指定类型、参数模板化或整体模板化。继承类模板时,子类必须指定父类模板参数类型(或自身转为类模板)。此外,成员函数可在类外实现,需通过templa
2025-09-21 08:00:00
570
原创 普通函数与模板函数区别
C++函数模板与普通函数的主要区别在于:1)普通函数支持隐式类型转换,而自动类型推导的模板函数不支持;2)调用规则上,优先调用普通函数,可通过空模板参数列表强制调用模板;3)模板存在局限性,无法处理数组赋值等操作,可通过模板重载和具体化解决。特别地,针对自定义类型可提供具体化模板实现特殊处理。使用建议:优先显示指定模板类型,避免同时提供普通函数以防止二义性。模板技术的核心目的是为STL等库的应用提供支持。
2025-09-20 15:35:44
442
原创 C++模板介绍
C++函数模板是泛型编程的核心工具,允许创建与类型无关的函数。通过template<typename T>声明,函数可以处理多种数据类型。使用时需注意:自动类型推导必须一致,且必须确定T的类型才能使用。案例展示了利用模板实现通用的数组排序功能,支持int和char类型数组,通过选择排序算法实现降序排列。函数模板提高了代码复用性,将数据类型参数化,简化了针对不同类型重复编写相似代码的过程。
2025-09-20 15:18:22
188
原创 C++中的引用
C++引用使用指南:引用是变量的别名,通过数据类型&别名=原名声明。引用必须初始化且不可更改指向对象。引用传递函数参数可简化指针操作,实现形参修饰实参的效果。注意事项:1)不要返回局部变量引用;2)引用本质是指针常量;3)常量引用(const int&)可防止误操作。引用比指针语法更简洁安全,推荐用于函数参数传递和返回值场景。通过引用可高效操作变量,同时确保代码可读性和安全性。
2025-09-13 08:00:00
913
原创 代码中栈区和堆区的联系
在C++中,动态内存分配(如new)会在堆区创建对象,其内存地址存储在栈区的指针变量中。解引用指针(ptr)时访问的是堆区的实际数据内容。例如,intp=new int(42)中,p是栈上的指针变量,保存堆地址0x1000;*p操作则访问堆区存储的值42。通过&p获取指针自身在栈区的地址,而p保存的是堆区地址。注意区分指针变量(栈区)与其指向的数据(堆区),避免混淆指针地址和指针内容。使用后需用delete释放堆内存。
2025-09-12 12:00:00
312
原创 C++ 内存分区模型简介
C++程序运行时内存主要分为四大区域:代码区存放编译后的二进制指令(只读共享);全局区存储全局变量、静态变量和常量(生命周期最长);栈区自动管理函数参数和局部变量(速度快但容量小);堆区用于动态分配内存(需手动管理,容量大但速度慢)。值传递时会在栈区创建副本,函数结束自动释放。各区域特点鲜明,共同支撑程序高效运行。
2025-09-12 08:00:00
1789
1
原创 结构体的概念与使用
struct 结构体名 { 结构体成员列表 };通过结构体创建变量的方式有三种:struct 结构体名 变量名struct 结构体名 变量名 = { 成员1值 , 成员2值...}定义结构体时顺便创建变量写法C 语言C++ 语言说明✅ 合法✅ 合法定义类型 + 同时声明变量(C/C++ 都支持)✅ 合法✅ 合法声明变量并用{}初始化为 0(推荐写法)❌非法✅ 合法使用列表初始化(list initialization),是 C++ 特性//结构体定义//成员列表//姓名。
2025-09-11 14:38:52
1171
原创 指针的基本概念和用法
本文介绍了指针的基本概念及其应用。主要内容包括:1)指针的定义与解引用操作;2)指针变量与普通变量的区别;3)空指针和野指针的注意事项;4)const修饰指针的三种情况;5)指针与数组的配合使用;6)指针在函数参数传递中的作用;7)通过冒泡排序案例展示指针、数组和函数的综合应用。文章还详细讲解了不同位数系统下指针的内存占用情况,以及指针运算的规则。通过代码示例,帮助理解指针的核心概念和实际应用场景。
2025-09-11 13:10:23
830
原创 ROS 2 C++ 项目标准创建流程(基于 WSL + 最新 ROS 2 工具链)
ROS 2 C++ 项目创建流程总结 本文详细介绍了在WSL2(Ubuntu)环境下创建标准ROS 2 C++项目的完整流程: 使用ros2 pkg create命令自动生成C++包结构,包含include/<package_name>目录 手动创建launch和config目录用于存放启动文件和参数 创建头文件和实现文件,遵循ROS 2命名规范 编写启动脚本和参数配置文件 配置CMakeLists.txt确保正确安装可执行文件、头文件和资源文件 使用colcon build编译项目
2025-08-26 15:49:18
593
原创 Flask 出现 ImportError: cannot import name ‘url_quote‘ from ‘werkzeug.urls‘ 的报错解决方法
Flask运行时出现"url_quote"导入错误可能由三个原因导致:1) Werkzeug与Flask版本不兼容,可通过更新Flask解决(pip install -U flask或强制重装);2) Python和Anaconda环境冲突,需调整PATH变量顺序让Python优先;3) 建议创建虚拟环境隔离安装(python -m venv env,激活后pip install flask)。检查版本和路径命令:python --version、where python、where p
2025-07-05 10:45:11
2012
原创 Git简单使用教程
Git是一款分布式版本控制系统,由Linus Torvalds开发,主要用于软件开发中的版本管理。其主要特点包括分布式开发、高效分支管理、数据完整性保障等。Git的工作流程涉及克隆仓库、创建分支、提交更改、推送远程等操作。文件状态分为未跟踪和已跟踪,通过暂存区进行中间管理。分支功能支持多人协作开发,合并时可能产生冲突需手动解决。远程仓库操作包括添加远程地址、推送代码等。Git通过命令行和图形界面工具提供灵活的项目管理能力,是个人和团队开发的重要工具。
2025-07-05 07:30:00
1273
原创 USART串口数据包
本文介绍了两种串口通信数据包格式及处理方法。HEX数据包采用固定/可变包长设计,通过包头包尾(如0xFF/0xFE)分隔数据,解决接收数据错位问题。针对数据与包头包尾冲突,提出了三种解决方案:数据限幅、固定包长对齐和使用特殊包头包尾组合。文本数据包采用可变包长,以"@"为包头、"\r\n"为包尾,在接收端通过状态机实现数据解析。文中还给出了基于STM32的具体中断处理代码实现,展示了状态机在数据包接收中的应用。两种方案各具特点,HEX包适合二进制数据,文本包适合字符数
2025-06-29 10:40:13
1046
原创 串口输出的三种方式
本文介绍了C语言中串口通信的三种实现方法:1. 输入输出重定向,通过改写fputc/fgetc函数实现单个字符的收发,并扩展了字符串收发功能;2. 使用sprintf格式化字符串后发送;3. 封装可变参数的Serial_Printf函数,支持格式化输出。文中提供了详细的代码实现,包括字符/字符串的收发处理、状态检测等关键操作,适用于嵌入式系统中的串口通信开发。这些方法都需要包含stdio.h等标准头文件,并可根据实际需求选择使用。
2025-06-29 09:59:37
578
原创 STM32中Usart的使用
USART是STM32中的串行通信接口,支持同步/异步模式(常用异步UART)。它包含数据寄存器、发送/接收控制器和波特率发生器,支持8/9位数据长度、校验位及不同停止位。串口通信使用TTL、RS232或RS485电平标准,需匹配电平才能互连。通信协议包括起始位、数据位、校验位和停止位,波特率决定传输速率。USART通过硬件流控(nRTS/nCTS)防止数据丢失,并提供8倍或16倍过采样以提高抗噪性。其结构分为发送器、接收器和控制单元,需配置USART_CR1寄存器启用功能。波特率由USART_BRR寄存器
2025-06-28 20:39:48
1378
原创 MQ135在STM32中的使用
MQ135传感器对氨气、硫化物、苯系蒸汽的灵敏度高,对烟雾和其它有害的监测也很理想。这种传感器可检测多种有害气体,是一款适合多种应用的低成本传感器。当传感器所处环境中存在污染气体时,传感器的电导率随空气中污染气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。特点:在较宽的浓度范围内对有害气体有良好的灵敏度,对氨、硫化物、苯系等气氛灵敏度较高,长寿命、低成本,且简单的驱动电路即可。DO 接口为数字量输出 AO 接口为模拟量输出。4 Pin(2.54mm 间距排针)
2025-06-28 18:13:23
899
原创 SU-03T1烧录使用教程
SU-03T1是一款低成本、低功耗的离线语音识别模块,适用于智能家居、小家电等场景。该模块支持自定义唤醒词和指令,通过智能公元平台可实现零代码开发,简化开发流程。烧录过程需使用专用软件,连接UART1串口(B6、B7引脚),注意电源需5V供电。开发者在平台配置引脚、指令后生成固件,通过USB转TTL工具烧录即可使用。模块支持二次开发,配套SDK可进行复杂功能扩展。
2025-06-03 16:00:13
1519
原创 Windows中“无法成功完成操作,因为文件包含病毒或潜在的垃圾软件
出现这个问题的主要原因是因为系统把软件识别成为了病毒软件。在最近写代码的过程中,使用一个软件的时候出现 “(2)首先点击病毒和威胁防护,然后点击管理设置。(1)搜索 “windows安全中心”(3)滑倒最下面,找到添加或删除排除项。(4)添加需要排除的目录。
2025-05-28 20:12:55
22553
原创 EMQX本地部署
MQTT(Message Queuing Telemetry Transport)是一种轻量级消息协议,专为低带宽、不可靠或高延迟网络环境设计,广泛应用于物联网(IoT)领域。其特点包括低功耗、发布/订阅模式、高效传输、三种服务质量等级(QoS)、遗嘱消息和保留消息。MQTT在智能家居、工业自动化和移动应用开发中表现优异,已成为物联网通信的事实标准,得到阿里云、AWS IoT等平台支持。EMQX提供了公用服务器用于调试,但需注意订阅和发布名称的独特性以避免数据干扰。本地化部署时,需在腾讯云服务器上打开特定端
2025-05-12 18:50:29
1013
原创 树莓派的系统烧录
树莓派是一款小型但功能强大的单板计算机,最初设计用于教育领域以促进编程和计算机科学的学习,但现在广泛应用于从学习、项目开发到服务器应用和物联网等多个领域。它能够支持各种DIY项目,如机器人控制、智能家居系统等,并且可以作为个人服务器或多媒体中心使用。根据性能和用途的不同,树莓派主要分为几个系列:Raspberry Pi 4 Model B,提供高性能处理能力和丰富的接口;Raspberry Pi 3系列,包括增强版的Model B+和紧凑型的Model A+;
2025-04-24 15:05:34
2455
原创 基于halo搭建个人博客平台
Halo 是一个现代化的、功能丰富的开源博客发布平台,旨在为创作者提供一个简单而强大的工具来管理他们的内容。它不仅支持基本的博客文章发布功能,还提供了多种扩展插件和主题以满足不同的需求。Halo 以其简洁的设计和用户友好的界面著称,适合那些希望专注于写作而不被复杂技术问题困扰的博主使用。此外,Halo 还支持多用户协作、SEO优化等功能,并且由于其开源特性,用户可以根据自己的需要自定义或扩展功能。
2025-04-16 18:23:29
1608
原创 ADC 模数转换器
对于gpio来说,它只能读取引脚的高低电频,要么是高电平,要么是低电平,只有两个值,而使用了adc之后,就可以对这个高电平和低电平之间的任意电压进行量化,最终用一个变量来表示,读取这个变量就可以知道引角的具体电压到底是多少来,所以adc其实就是一个电压表,把引脚的电压值测出来,放在一个变量里,这就是adc的作用。
2025-04-16 00:41:08
1762
原创 TIM 编码接口
第一个时刻A相上升沿对应B相低电平,对应表里的第一行;第二个时刻B相上升沿对应A相电平,是表里的第三行;第三个时刻A相下降沿对应B相高电平,是表里的第二行;最后是B相下降沿对应A相低电平,是表里的第四行,之后就是第一个到第四个状态的重复。反转第一个时刻B相上升沿对应A相低电平。第二个时刻A项上升沿对应B相高电平。第三个时刻B相下降沿对应A相高电平。第四个时刻A相下降沿对应B相低电平。
2025-04-12 15:06:28
1314
原创 TIM 输入捕获
IC(Input Capture)输入捕获输入捕获的功能描述: 输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,(就是输入引脚电平跳变的瞬间将CNT的值锁存到CCR中)。输入捕获的作用:可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。
2025-04-12 01:00:00
1164
原创 TIM 输出比较
OC(Output Compare)输出比较输出比较可以通过比较CNT计数器与CCR捕获比较寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器的前3个通道额外拥有死区生成和互补输出的功能。IC:(Input Capture)输入捕获CC:(Capture / Compare)一般表示的是输入捕获和输出比较的单元CNT:计数器CCR:(R:register,寄存器的意思)捕获/比较寄存器。
2025-04-11 14:52:06
1447
原创 Nginx服务建立
Nginx继之后的另一款在Linux下被大量使用的Web服务软件。Nginx的优势在于:稳定性低系统资源损耗小巧,软件安装包小简陋,定制化强高并发能力,一台物理服务器可处理个并发请求。1.2 Nginx 部署。
2025-04-09 00:30:00
1322
原创 Tomcat 负载均衡
Tomcat是在服务器中使用Tomcat虽然和或者Nginx服务器一样,具有处理HTML页面的功能,但是其处理静态HTML的功能不及前两者。Tomcat 通常是作为Java主页的解析容器。
2025-04-08 23:14:22
1239
原创 建立PHP解析以及主页的控制访问
注意:后者覆盖前者,如下例所示:这个例子中虽然最后是禁止172.16.1.0/24访问,但是使用时候还是可以访问,是因为Order deny, allow中allow覆盖了deny,这里要把deny和allow换位置,改成 Order allow,deny。在任何情况下,Web根目录中的任何敏感资源都应该受到适当的访问控制,并且不应该碰巧知道或猜测URL的未经授权的一方访问。关闭httpd,查看php是否成功,client中的是php成功之后登录的样子,在Windows 2016 Server中访问。
2025-04-08 09:00:00
924
原创 钓鱼网站攻防
网络钓鱼是一种网络欺诈行为,指不法分子利用各种手段,仿冒真实网站的地址以及页面内容,以此来欺骗用户银行或信用卡账号、密码等私人资料。DNS 劫持与欺骗是其主要手段。1.2 DNS欺骗DNS 欺骗就是攻击者冒充域名服务器的一种欺骗行为,冒充域名服务器后,把查询的IP地址设为攻击者的IP地址,用户上网只能看到攻击者的主页,而不是想要的访问主页。在域名解析的过程中会首先检查本地缓存,在实验时,我们可以改变本地的域名指向,指向我们自己网站的IP。
2025-04-07 12:23:54
1103
原创 网络配置与日志服务器搭建
日志服务器:用处和他的名字一样,就是对 Server 中的日志进行存储,将其存储到独立的服务器中,反正黑客入侵的时候将 Server 中的日志进行删除,日志默认保存在 /var/log/ 下。将原有网卡配置文件/etc/sysconfig/network-scripts/ifcfg-ens32 备份,重新写入如下配置,即可配置网卡通过DHCP 自动获取IP地址。上面这条指令的意思入下:什么样的进程,什么样的级别,产生的日志保存在哪里,这里的.*代表所有。
2025-04-07 12:23:17
1957
原创 TIM 定时中断
TIM(Timer)定时器,定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断,这是定时器最基本的功能,就是定时触发中断。(定时器就是一个计数器,当这个计数器的输入是一个准确可靠的基准时钟的时候,那他在对这个基准时钟进行计数的过程,就是计时的过程)。比如在stm32中,定时器的基准时钟一般都是主频72MHz,比如我对72MHz即72个数,那就是一MHz,也就是1微秒的时间,如果记72000个数,那就是1000Hz,也就是1ms的时间。
2025-04-06 11:29:18
1216
原创 自制便携屏
说一下LVDS的,这个在购买时候还会分为2K板,4K板,可能还有其他的板子,但是我购买时候只问了这两种,按照客服和我说的如下:2560 1600 2.5K的屏用 2k的板只能上60hz,用4K的板可以上高刷 HDMI可以130hz , typec信号源可以上144hz ,是达不到我买的屏幕的165Hz的,因为我个人觉得超过100Hz,我也看不出来,所以我也无所谓,因此我觉得现在卖的很便宜的屏幕可能是屏幕是高刷的,但是他的驱动是达不到这样的刷新的,但是他仍然标屏幕的高刷,仅个人推测,不供参考啊。
2025-04-06 11:28:31
1893
原创 定时器的基本使用
整个模块配置完成之后,需要使能计数器,定时器使能之后,计数器就会开始计数,当计数器更新时,触发中断,最后写一个中断函数,这个中断函数每隔一段时间就自动执行一次。① RCC开启时钟,定时器的基准时钟和整个外设的工作时钟就都会同时打开。⑤配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级。④配置输出中断控制,允许更新中断输出到NVIC。注意:定时1S,就是定时1Hz。②选择时基单元的时钟源。
2025-03-26 00:29:43
1072
原创 EXTI 中断的使用和函数解释
如果先要在主程序中查看和清除标志位,就用第三个中断标志管理中的函数,如果需要在中断函数中查看和清除标志位,就使用中断请求管理中的两个函数。这四个函数都是类似功能的函数,都是读写转态寄存器,只是第四个中断请求管理中的函数只能读写与中断有关的标志位,并且对中断是否允许做出了判断,第三个中的两个函数只是一般的读写标志位,没有额外的处理,能不能触发中断的标志位都能读写。EXTI中断配置的步骤如下:配置RCC,将用到的外设时钟打开。配置GPIO,设置为输入模式。
2025-03-26 00:29:19
855
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅