<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[sakabu的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/sakabu</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sakabu]]></copyright><item><title><![CDATA[灵巧手抓杯背后的控制奥秘]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/168545194</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/168545194</guid><author>sakabu</author><pubDate>Tue, 20 Oct 2026 12:26:29 +0800</pubDate><description><![CDATA[本文系统探讨具身智能灵巧手从指尖运动学到嵌入式闭环控制的实现路径。针对拿杯任务，剖析了全身控制与手部控制的协同机制，强调腕部运动、接触力与动态扰动对抓握稳定性的影响。指出机械模型（如关节耦合、传动标定）决定控制边界，任务空间建模需匹配实际操作需求。提出关键点几何处理流程：通过掌部坐标系构建与向量投影，消除手腕运动干扰，确保指尖目标准确映射。最终实现从感知到执行的闭环控制，为灵巧手在复杂场景下的稳定操作提供理论与方法支撑。]]></description><category></category></item><item><title><![CDATA[ESP32应用——UDP组播/广播（ESP-IDF框架）]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/150544573</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/150544573</guid><author>sakabu</author><pubDate>Sat, 23 Aug 2025 21:42:52 +0800</pubDate><description><![CDATA[本文介绍了基于ESP32和ESP-IDF框架的UDP组播/广播实现，用于设备自动发现功能。文章首先对比了单播、广播和组播三种网络通信方式的特点及应用场景，重点讲解了组播在局域网中的实现原理。随后详细展示了UDP客户端的代码实现，包括Socket创建、绑定、组播组加入以及非阻塞数据接收等关键步骤。代码示例中封装了JSON数据解析和IP地址提取功能，并通过FreeRTOS任务管理UDP通信状态。该方案有效解决了设备部署时IP地址未知的问题，为远程管理和后续OTA升级奠定了基础。]]></description><category></category></item><item><title><![CDATA[ESP32应用——HTTP client（ESP-IDF框架）]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/150005573</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/150005573</guid><author>sakabu</author><pubDate>Tue, 19 Aug 2025 17:41:07 +0800</pubDate><description><![CDATA[本文介绍了HTTP协议的基础知识及在ESP-IDF项目中的应用。主要内容包括：1. URL的结构与组成，包含协议、主机名、端口等要素；2. HTTP协议工作原理，包括请求-响应模型、请求/响应结构、8种主要请求方法及状态码分类；3. ESP-IDF中HTTP客户端的实现流程，通过esp_http_client组件实现设备与服务器通信；4. 具体应用案例，包括设备配置下载、状态上报、固件升级等5个服务接口的实现。重点解析了二进制数据下载的事件处理机制，并展示了如何通过JSON处理数据交互。]]></description><category></category></item><item><title><![CDATA[cJSON库应用]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/149909560</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/149909560</guid><author>sakabu</author><pubDate>Tue, 05 Aug 2025 21:11:17 +0800</pubDate><description><![CDATA[本文介绍了JSON数据格式及其在ESP32开发中的应用。JSON作为一种轻量级文本数据格式，能够灵活表示树形结构数据，支持字符串、数字、布尔值、null、对象和数组6种数据类型。重点讲解了cJSON库的使用方法，包括如何创建JSON对象、添加键值对、解析JSON数据以及内存管理等。通过医疗设备使用记录和服务器响应两个实际案例，详细演示了JSON数据的构造、打印和解析过程。文章最后指出，这些知识将为后续ESP32的HTTP客户端开发奠定基础，实现设备与服务器之间的JSON数据通信。]]></description><category></category></item><item><title><![CDATA[ESP32 外设驱动开发指南 (ESP-IDF框架)——GPIO篇：基础配置、外部中断与PWM（LEDC模块）应用]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/149335406</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/149335406</guid><author>sakabu</author><pubDate>Thu, 31 Jul 2025 21:01:59 +0800</pubDate><description><![CDATA[本文介绍了基于ESP32-S3和esp-idf框架的开发实践，重点讲解了GPIO控制、外部中断和LEDC PWM模块的应用。详细解析了GPIO配置函数、LED驱动实现和按键扫描程序。在外部中断部分，阐述了中断处理流程、配置方法和消抖技巧。最后深入讲解了PWM原理，对比了软件PWM和硬件PWM的实现方式，并给出了硬件PWM呼吸灯的具体实现方案，包括定时器配置、渐变功能设置和事件回调机制。文章为ESP32开发者提供了实用的外设驱动开发指南，后续还将持续更新JSON、OTA等物联网相关技术内容。]]></description><category></category></item><item><title><![CDATA[基于Linux C语言多线程服务器+Qt客户端+STM32客户端实现的无人超市项目]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/146562011</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/146562011</guid><author>sakabu</author><pubDate>Sun, 30 Mar 2025 18:37:55 +0800</pubDate><description><![CDATA[这个是前段时间做的一个项目，综合性很强，还是值得学习的。技术栈有Linux系统编程（线程编程、进程间通信、网络编程作为socket服务端）、MySQL数据库（服务端和数据库进行交互，存储和读取数据）、Qt上位机开发（作为socket客户端）、STM32使用8266WIFI模块也作为socket客户端。Linux网络编程Qt网络调试助手MySQL数据库开发。其中Qt我写了两个程序都作为socket的客户端（client），其中Qt管理员端主要负责商品和会员信息的注册和数据的修改工作。]]></description><category></category></item><item><title><![CDATA[Linux安装MySQL数据库并使用C语言进行数据库开发]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/146509880</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/146509880</guid><author>sakabu</author><pubDate>Tue, 25 Mar 2025 20:31:47 +0800</pubDate><description><![CDATA[由于最近在做项目，需要用到数据库，想在Linux服务端使用C语言操作MySQL数据库，于是写一篇博客记录一下。希望大伙点个关注支持一下，不久后就更新项目博客。编译的时候需要指定头文件路径以及链接mysqlclient库。项目中只用到了数据的插入、修改、删除和查询（如果你也是想用C语言对数据库进行简单操作，你可以参考我的代码）。后面我会更新Linux下C语言编写的服务端+Qt管理员端+Qt用户端+STM32用户端实现的无人超市项目。希望大家点个关注支持一下。]]></description><category></category></item><item><title><![CDATA[Qt项目之网络调试助手（详细源码讲解）]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/146048139</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/146048139</guid><author>sakabu</author><pubDate>Thu, 06 Mar 2025 21:01:49 +0800</pubDate><description><![CDATA[本次项目源码在我资源里免费下载！使用QT封装好的类：QTcpServer和QTcpClient，和Linux网络编程类似，写一个服务端和客户端，程序运行结果如下：（还有一点点小瑕疵，但是主要的功能都实现了，直接调用封装好的函数即可）// 获取文本编辑框的光标并移动到末尾// 设置文本颜色格式// 插入文本并换行（兼容不同平台）// 更新文本编辑框的光标状态// 自动滚动到最新内容。]]></description><category></category></item><item><title><![CDATA[Qt项目之串口调试助手]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/146027989</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/146027989</guid><author>sakabu</author><pubDate>Wed, 05 Mar 2025 00:29:29 +0800</pubDate><description><![CDATA[Qt项目--记事本。完整源码在我的资源里免费下载！界面如下，模仿安信可的串口调试助手界面，功能所见即所得：​话不多说，开始该项目的学习。/*--------自定义的mycombobox.cpp文件里--------*///鼠标按下的事件//发出一个信号/*-------构造函数里-------*/// 刷新可用串口名称的函数（通过自定义ComboBox，检测鼠标点击事件）// 清空串口号下拉框中的所有选项// 获取当前系统中所有可用的串口信息// 遍历所有可用的串口信息。]]></description><category></category></item><item><title><![CDATA[基于STM32的环境监测系统（自制蓝牙APP）]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/145997421</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/145997421</guid><author>sakabu</author><pubDate>Tue, 04 Mar 2025 21:11:24 +0800</pubDate><description><![CDATA[主控为stm32f103c8t6。使用DHT11温湿度传感器和MQ-2烟雾传感器，读取并实时刷新在0.96寸OLED屏幕上，同时通过蓝牙模块HC-05使用串口通信将数据上传到上位机（自制蓝牙APP）。可手动控制蜂鸣器以及电机作为报警器和风扇；在自动预警模式下，监测到温度高出设定的阈值后打开风扇降温；当监测到烟雾浓度高出设定阈值后将关闭风扇防止火情蔓延，并开启蜂鸣器报警，上位机同步更新报警状态。]]></description><category></category></item><item><title><![CDATA[基于STM32HAL库的万年历系统]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/145502536</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/145502536</guid><author>sakabu</author><pubDate>Sun, 09 Feb 2025 19:25:42 +0800</pubDate><description><![CDATA[本篇博客来做一个简易的万年历系统，需要用到旋转编码器和0.96寸OLED屏幕，以及STM32内部的RTC时钟；程序应当分为两种主要模式：普通模式与设置模式；普通模式下程序从RTC中获取当前的unix时间戳，然后将其按照一定的格式显示在OLED屏幕上；按下旋转编码器，可以进入设置模式，会有光标在数据下闪烁，顺时针旋转旋钮数据增加，逆时针减少；再次按下旋钮切换到下一个参数的修改，依次修改年月日时分秒后再次按下旋钮就回到普通模式，将设置好的时间转换为戳写入到RTC中，同时自动设置好星期，并显示在OLED屏幕上。]]></description><category></category></item><item><title><![CDATA[HAL库外设宝典：基于CubeMX的STM32开发手册（持续更新）]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/145409954</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/145409954</guid><author>sakabu</author><pubDate>Fri, 07 Feb 2025 00:03:58 +0800</pubDate><description><![CDATA[这是一份专注于STM32 HAL库的实战学习笔记，你将通过它掌握两大核心技能：手把手教你通过CubeMX配置常用外设，摆脱对标准库的依赖；像查字典一样随时检索HAL库函数用法，快速解决开发中的配置难题。这里都会提供开箱即用的代码模板和直击痛点的配置要点。话不多说，让我们直接开启HAL库的学习之旅，本教程会持续更新，希望大家关注支持一下。]]></description><category></category></item><item><title><![CDATA[Qt项目之我的记事本（手把手教学，面向Qt零基础教学，包含源码以及详细注释）]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/145348240</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/145348240</guid><author>sakabu</author><pubDate>Sun, 26 Jan 2025 01:47:26 +0800</pubDate><description><![CDATA[本课程会从0开始，手把手带你熟悉Qt的开发流程，每讲一个Qt的类，我都会先写一些示例代码，再根据最终需要的效果给出最终代码，跟着我一步一步做，你也可以做出属于你自己的记事本，源码可以从我的资源直接下载，希望大家关注支持一下，后续还会同步更新Qt项目的学习笔记。众所周知Qt是一个基于C++的框架，主要用来开发带窗口的应用程序。我们使用的基于窗口的应用程序都是基于事件，其目的主要是用来实现回调（因为只有这样程序的效率才是最高的）。]]></description><category></category></item><item><title><![CDATA[C++基础入门（二）]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/145146332</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/145146332</guid><author>sakabu</author><pubDate>Thu, 16 Jan 2025 17:00:09 +0800</pubDate><description><![CDATA[类的构造函数是类的一种特殊的成员函数，它会在每次创建类的新对象时执行。构造，那构造的是什么呢？构造成员变量的初始化值，内存空间等。构造函数的名称与类的名称是完全相同的，并且不会返回任何类型，也不会返回 void。构造函数可用于为某些成员变量设置初始值。// 使用std命名空间public:// 不需要使用std::stringint year;// 无参构造函数Car() {brand = "未知";year = 0;cout ]]></description><category></category></item><item><title><![CDATA[C++基础入门（一）]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/145076259</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/145076259</guid><author>sakabu</author><pubDate>Sun, 12 Jan 2025 16:52:59 +0800</pubDate><description><![CDATA[本系列博客是给后续 QT 的学习打下基础，掌握了 C 语言再来看 C++基础的系列文章，才会比较好理解。假设我们要创建一个命名空间来包含与圆形相关的功能。cir.h在这个头文件中，我们定义了一个名为Cir的命名空间，其中包含了计算圆的面积和周长的函数，以及圆周率常量PI。int main()printf("半径为%f的圆，周长为%f,面积为%f\n",return 0;可以看到我这里使用了 C 语言的写法，说明某些情况下，C 语言和 C++ 是可以混着写的。]]></description><category></category></item><item><title><![CDATA[Linux应用项目之量产工具（六）——业务系统]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/144156581</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/144156581</guid><author>sakabu</author><pubDate>Sun, 01 Dec 2024 03:17:13 +0800</pubDate><description><![CDATA[前面我们完成了量产工具的各个子系统：显示、输入、文字、UI、页面。这样的架构很容易扩展，可以在这上面实现各种业务：比如可以做收银机、自动售卖机、智能秤、取号机；再加上摄像头显示，就可以做出可视对讲、视频监控、人脸红外测温等等。前面初始化各个子系统都与我们的业务没有关系，最主要的是调用主页面里的 Run 函数，所以Run 函数在做什么事情就和业务严重相关，我们要做的就是编写主页面的 Run 函数。至此，量产工具这个项目我们就完成了，这是韦东山老师的一个项目。]]></description><category></category></item><item><title><![CDATA[Linux应用项目之量产工具（五）——页面系统]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/143931974</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/143931974</guid><author>sakabu</author><pubDate>Thu, 21 Nov 2024 11:12:41 +0800</pubDate><description><![CDATA[前面我们完成了量产工具的显示、输入、文字、UI系统；这节我们来实现页面系统的代码。代码比较简单。我们在主界面点击一个按钮后，可以跳转到另一个界面执行其他操作，我们怎么去统一的表示这些界面？我们需要抽象出一个结构体。页面管理器用来管理页面：只需要实现 2 个函数：1.PageRegister：把多个页面注册进链表2.Page(name)：取出某个界面，得到它的句柄。]]></description><category></category></item><item><title><![CDATA[Linux应用项目之量产工具（四）——UI系统]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/143901096</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/143901096</guid><author>sakabu</author><pubDate>Wed, 20 Nov 2024 14:24:48 +0800</pubDate><description><![CDATA[所谓 UI ，就是 User Interface（用户界面），有图像界面（GUI）等；我们的UI系统，就是构造各类GUI元素，比如按钮(目前只实现按钮)。怎么描述一个按钮呢？它的位置、大小怎么表示？怎么绘制它？用户点击它之后，如何处理？点击按钮后怎么处理，是业务系统的事情（顶层APP），所以应该提供一个 InitButton 函数，让用户可以提供 OnPressed 等底层函数，上层代码通过下面 3 个函数使用按钮。至此UI系统就完成了。]]></description><category></category></item><item><title><![CDATA[Linux应用项目之量产工具（三）——文字系统]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/143787407</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/143787407</guid><author>sakabu</author><pubDate>Fri, 15 Nov 2024 20:11:15 +0800</pubDate><description><![CDATA[前面我们完成了量产工具的显示系统和输入系统，这节我们来实现文字系统，套路和前两节类似，先抽象出数据结构然后再对代码进行封装。我们要抽象出一个结构体 FontBitMap ，能描述一个“字符”：位置、大小、位图；我们还要抽象出一个结构体 FontOpr ，能描述字体的操作，比如Freetype的操作、固定点阵字体的操作。底层代码需要实现这三个函数，后面也会有管理层，底层需要把自己注册到管理链表里，上层代码就可以直接调用底层代码而无需关心细节。这就是面向对象的编程思想。]]></description><category></category></item><item><title><![CDATA[Linux应用项目之量产工具（二）——输入系统]]></title><link>https://blog.youkuaiyun.com/sakabu/article/details/143726919</link><guid>https://blog.youkuaiyun.com/sakabu/article/details/143726919</guid><author>sakabu</author><pubDate>Thu, 14 Nov 2024 20:25:04 +0800</pubDate><description><![CDATA[前面我们完成了量产工具显示系统部分，见本篇实现输入系统。我们这个项目支持不同的输入设备，比如触摸屏和网络输入，这些输入设备都会向上层提供数据，那么这些数据的结构要统一；另外，对于不同的输入设备，我们也应该抽象出一个统一的结构体来表示。我们想支持同时从多个输入设备里面得到数据，就需要提供一个输入管理。​
需要为每一个输入设备创建一个线程，就像单片机引入操作系统FreeRTOS一样，要用到线程编程。相关知识见：Linux线程编程。不能使用单一的变量来保存数据，而是使用一个数组来保存数据，使用“环形缓冲区”。]]></description><category></category></item></channel></rss>