- 博客(86)
- 收藏
- 关注
原创 STM32——I2C协议
初学、做项目、怕翻车 → 一律用 软件 IIC熟练、高速通信、不用兼容任意引脚 → 用 硬件 IICSCL 时钟、SDA 数据,一主多从、靠地址区分设备。起始、停止、发字节、应答。软件 IIC:普通 GPIO + 代码模拟时序,简单稳定、引脚随意。硬件 IIC:专用引脚 + 外设自动时序,速度快但有 bug、引脚固定。初学和普通项目优先软件 IIC。
2026-05-08 22:23:30
306
原创 STM32F103——超声波模块
本工程基于STM32F103 标准库,使用通用定时器 TIM2做精准计时,驱动 HC-SR04 超声波模块,实现距离测量;连续采集 5 次距离做均值滤波,最后通过串口打印输出距离值,测量更稳定、精度更高。核心逻辑:TIM2 配置为1ms 定时中断,配合定时器计数器微秒级读数,拼接得到 Echo 高电平总时长,利用超声波测距公式换算成实际距离。
2026-05-05 23:56:25
682
原创 STM32——定时器中断
定时器基本配置结构体:中断优先级配置结构体你的定时器配置:每 1 秒进一次中断中断里只做一件事:翻转 LED(快进快出)代码现在 100% 正确,烧录直接亮灯闪烁!
2026-05-05 17:09:07
587
原创 ESP8266——UDP传输
谁给 ESP 发数据,ESP 就自动回复给谁,IP / 端口可以变。电脑 SSCOM 立刻收到!在打开一个SSCOM的副本。,一对一通信,最稳定。
2026-05-04 21:44:27
351
原创 ESP8266——烧录AT固件
ESP8266-01S 模块USB 转 TTL(CH340/CP2102,必须 3.3V 电平)杜邦线(母对母)电脑(Windows)软件:CH340 驱动(装好,识别 COM 口)乐鑫烧录工具:Flash Download Tools(推荐 v3.8.5)固件:安信可 ESP8266 AT 固件(DOUT 1M 1.5.4.1 / 1471 版)
2026-05-03 23:04:59
619
原创 STM32——蓝牙模块双串口控制led
本项目实现了STM32 与蓝牙模块 + 电脑串口手机蓝牙调试助手发送指令,通过蓝牙模块控制 STM32 上的 LED 亮灭;电脑串口助手可以实时接收到控制指令与反馈信息,实现调试与监控;采用双串口架构:USART1 负责与电脑通信,USART2 负责与蓝牙模块通信,互不干扰。
2026-05-03 16:59:00
535
原创 STM32——串口通信(USART)
串口收发定时器 PWMSPI、I2C外部中断这种多功能切换就叫复用功能。有些引脚不够用,可以把默认串口引脚换到别的引脚,这就叫重映射。
2026-05-02 14:38:57
518
原创 STM32——外部中断
STM32 的每个 GPIO 引脚不只有普通输入 / 普通输出这一种功能;普通 GPIO 输入输出串口收发SPI、I2C定时器 PWM外部中断输入这种一个引脚具备多种硬件功能,就叫复用功能(Alternate Function)。前面说了:PA0、PB0、PC0…… 都共用 EXTI0 这一根中断线。单片机不知道你到底想用哪一个端口的第 0 脚做中断;把哪一个 GPIO 端口的引脚,绑定到对应的 EXTI 中断线上这个指定绑定的过程,就叫重映射。NVIC 是单片机内核自带的。
2026-04-30 22:45:29
686
原创 STM32——按键控制led灯
本次实现 STM32 双按键控制单个 LED 亮灭功能:我这边板子的 PA1接led,PA0接按键1,PC13接按键2,在写的时候看自己板子的原理图,板子不一样,直接搬运肯定是不行的。
2026-04-27 22:17:51
362
原创 STM32——led灯点亮
这三行是引入头文件,告诉编译器要用哪些功能。 里写了 ,所以这里才能调用。 main 函数 = 程序的入口 单片机上电后,第一行就跑这里。 调用你写在 里的初始化函数 作用:把 PA1 引脚设置成输出模式 不初始化,LED 永远不会亮! = 死循环,单片机永远在这里循环 = 输出 低电平(0V) 我的 LED 是 低电平点亮,所以一输出低电平就亮了 引入需要的库,不然编译器不认识结构体。 这是你自己写的 LED 初始化
2026-04-26 21:21:37
470
原创 嵌入式数据库——API创建
main 函数:打开数据库 → 创建表 → 显示菜单 → 调用功能函数do_insert:输入信息 → 拼接 SQL → 插入数据库do_delete:输入 id → 删除对应数据do_update:输入 id 和新成绩 → 修改数据callback:查询时自动打印数据do_query1:回调方式查询do_query2:无回调、直接表格打印(最常用)所有功能全部实现,成功执行。
2026-04-22 00:14:02
589
原创 嵌入式数据库——SQLite基础
数据是描述事物的符号记录,是数据库的核心存储单元,可涵盖数字、文本、图像、音频、视频等多种形式,能被计算机系统识别、存储并通过程序进行加工处理。
2026-04-20 22:53:52
580
原创 基于 Socket 的FTP 云盘系统
FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。 程序运行,服务端不断接收客户端指令,服务端可同时处理多个客户端接入并对指令作出解析,并把执行结果返回给客户端,客户端根据服务端对指令的解析并把由服务端传递过来的处理信息通过客户端呈现给客户,实现文件的各种操作。Linux网络编程实现的FTP服务器,服务器由服务端和客户端组成,具有浏览远程服务
2026-04-19 23:35:18
987
原创 linux——TCPIP协议原理
客户端发 SYN:我要连你服务器回 SYN+ACK:同意,我也准备好客户端回 ACK:收到,连接成功一方发 FIN:我关了对方回 ACK:知道了(但可能还在发数据)对方发完再发 FIN:我也关了一方回 ACK:收到,彻底断开。
2026-04-16 20:44:17
305
原创 linux——IO多路复用
②超级核心:while 循环里的 select 四步。你得自己循环不停问:“有数据没?③select 醒来后:判断是谁发的数据。客户端发送代码(select 部分)Linux 中常用的 IO 模型,简单、稳定、绝大部分程序用的就是它。①定义 select 用到的变量。③ 服务器拼接回复消息(重点!④服务器把拼接好的消息发回客户端。①服务器读取客户端发来的消息。客户端一发,服务器立刻读到。你不能同时处理多个客户端。1.键盘有输入(你打字了)等数据到了 → 才返回。②服务器打印收到的消息。
2026-04-15 22:19:36
719
原创 linux——UDP编程
绑定 IP 和端口(和 TCP 一模一样)告诉系统:我要在这个端口收数据。④最核心:UDP 怎么收数据?UDP 没有 accept!①socket () 创建 UDP 套接字。不加这句,程序退出后,端口会被占用几十秒。谁发数据给这个端口,服务器就收谁的。②setsockopt()端口复用。④配置服务器地址(填短信收件人)谁发来都行,来了就收。把命令行的字符串端口→转成数字。③bind()绑定IP+端口。⑤接收后打印客户端信息。创建 UDP 套接字。①主函数&命令行参数。
2026-04-13 22:44:52
831
原创 linux——TCP多进程并发服务器
客户端要是断开连接,子进程就死了,但是父进程一直在死循环,无法回收子进程,子进程就会成为僵尸进程,过多的僵尸进程会大量占用资源,所以我门还要写个函数专门回收僵尸进程。其实与多线程的变化就在最后accept那部分的内容里。⑤父子进程分支2:父进程(pid > 0)④父子分支1:子进程(pid == 0)(子进程退出)信号时,请自动调用。多进程:来一个客户,开一个子进程。多线程:来一个客户,开一个线程。②死循环:父进程永远等客户端。③客户端来了 → 创建子进程。父进程只负责等连接,这是整个代码的灵魂,
2026-04-12 22:24:24
1234
3
原创 linux——TCP多线程并发服务器
这样客户端更灵活,相连接不同的服务器,不用总是修改代码,想连谁在终端输入对应的IP地址和端口号就行。accept 接到一个客户 → 立刻创建一个线程去服务它 → 主线程马上回去继续等下一个客户!同时也把客户端代码优化一下,以前的客户端代码,IP地址和端口号是写死的,我们改成命令行传参。多线程服务器 = 可以同时处理多个客户端。每个客户端,都由一个独立的线程服务!就是无线循环accept函数。线程函数用来接收数据代码。
2026-04-12 17:03:08
271
原创 linux——TCP编程
TCP编程APIsocket = 买手机bind = 给手机插卡绑定手机号有了手机+号码,别人才能联系你网络编程里:服务器必须socket+bind客户端只需要socket,不需要bind。
2026-04-11 22:29:20
782
原创 linux——网络基础
Socket 是网络编程的接口,相当于「网络通信的端点」,是一个特殊的文件描述符,支持等操作。它不局限于 TCP/IP,既支持面向连接的 TCP,也支持无连接的 UDP。
2026-04-10 21:44:44
1392
原创 linux——信号量
信号量 = 一个计数器 + 等待队列计数器-1如果计数器 < 0,线程阻塞等待计数器+1如果有等待的线程,唤醒一个③两个信号量的作用// 表示“空闲位置”,最多4个// 表示“已有产品数量”,初始0→ 链表最多放4 个节点→ 一开始链表空的,没有产品。
2026-04-09 21:54:49
530
原创 linux——读写锁
线程A加读锁成功,又来了B线程加写锁阻塞,又来了C线程加读锁阻塞。线程A加读锁成功,又来了三个线程,做读操作,可以加锁成功。线程A加写锁成功,又来了三个线程,做读操作,三个线程阻塞。线程A持有读锁,然后线程B请求写锁,然后线程C请求读锁。线程A持有写锁,然后线程B请求读锁,然后线程C请求写锁。线程C加锁, 线程B阻塞。线程B阻塞,线程C阻塞。线程B加锁,线程C阻塞。线程B阻塞,线程C阻塞。线程A加写锁成功,线程B请求读锁。线程A持有读锁,线程B请求写锁。线程A拥有读锁,线程B请求读锁。
2026-04-07 22:22:22
523
原创 linux——死锁
锁了一次,但锁里的代码业务崩溃,也就执行不了解锁,或者忘记解锁,都会造成死锁,所以操作做完之后一定要解锁。锁了两次,就会阻塞在第二个锁上,下面的代码也不会执行,自然也就不会解锁,就造成了死锁。trylock,这个是常识加锁,如果有锁就返回,不阻塞。线程1访问共享资源B,对B锁加锁-线程1阻塞在B锁上。线程2访问共享资源A,对A锁加锁-线程2阻塞在A锁上。在访问其他锁的时候需要先将自己的锁解开。线程1 对共享资源A加锁成功-A锁。线程2 对共享资源B加锁成功-B锁。让线程按照一定顺序去访问共享资源。
2026-04-07 20:58:51
86
原创 linux——原子操作
原子操作:不可被中断的一步操作多步操作(链表增删、i++)不是原子操作非原子操作在多线程下必须加锁锁可以让多步指令变成 “逻辑上的原子操作”不加锁 = 线程切换打断 = 数据混乱 / 程序崩溃加锁 = 安全执行 = 逻辑原子。
2026-04-07 20:43:03
198
原创 linux——线程设置分离属性
PTHREAD_CREATE_JOINABLE(非分离)PTHREAD_CREATE_DETACHED(分离)这段代码就是创建一个分离线程,主线程不用等它,他自己跑完自动回收资源,不需要pthread_join。也可以用pthred_detach(pthid),就属于创建后将普通线程修改为分离线程,效果是一样的。参数: attr : 线程属性。1.线程属性类型: pthread_attr_t attr;对线程属性变量的初始化。两种方法都可以,完全等价。通过属性设置线程的分离。
2026-04-06 21:20:29
188
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅