- 博客(146)
- 收藏
- 关注
原创 嵌入式单片机开发学习路线,从入门到高薪就业,保姆级学习攻略!
本文详细介绍了嵌入式开发的学习路线和就业方向。主要分为单片机开发、Linux应用开发和Linux驱动开发三大方向,重点讲解了51单片机和STM32的学习路径,包括C语言基础、开发环境配置、硬件基础等内容。进阶部分涵盖RTOS系统、物联网通信、GUI技术等核心技能,并推荐了多个实战项目资源。文章还提供了野火、正点原子等开发板选择建议,以及韦东山等优质教学资源。所有配套学习资料(嵌入式八股文、项目代码等)可通过微信公众号【嵌入式学习菌】获取。该路线适合零基础到进阶的嵌入式学习者系统化学习。
2024-08-30 11:09:25
4825
4
原创 工业场景实战案例--wifi联网
就像“手机连家里 WiFi” 的过程:手机设置里输入 WiFi 名称 / 密码(对应 ESP32 配置 STA 参数);点击“连接”(对应esp_wifi_start())→ 手机提示 “正在连接”(对应wifi_sta_connect);手机显示“已连接”(对应WIFI_EVENT_STA_CONNECTED),但此时可能还没网(没 IP);
2025-12-17 20:28:31
780
原创 ESP32 事件循环作用
本文介绍了ESP-IDF框架中两个核心功能的使用方法。第一部分讲解esp_event_loop_create_default函数,通过WiFi连接案例演示如何创建默认事件循环并注册回调函数,实现WiFi状态监听。第二部分详细说明SPIFFS文件系统的初始化流程,包括挂载参数配置、文件系统完整性检查及容量监控,并给出文件读写示例。文章内容实用性强,适合嵌入式开发者学习ESP32的事件处理和文件系统操作,作者还提供嵌入式学习资料获取渠道。
2025-12-16 07:11:55
880
原创 为什么二值信号量先释放,再获得,互斥量先获得,再释放
本文分析了二值信号量与互斥量的核心差异:二值信号量用于任务间同步(事件通知),采用"先释放后获取"的顺序,确保事件产生方先触发通知;互斥量用于资源保护,遵循"先获取后释放"原则,保证共享资源的独占访问。通过ESP32-IDF的传感器数据采集(二值信号量)和共享资源访问(互斥量)两个示例,分别展示了正确使用顺序的必要性及其实现逻辑。最后总结了两者在设计目的、初始值和操作顺序上的关键区别:二值信号量是"发消息"机制,互斥量是"借钥匙"
2025-12-15 18:54:20
789
原创 SPIFFS文件系统
摘要: 本文详细介绍了SPIFFS(SPI Flash File System)在ESP32嵌入式设备中的应用与初始化流程。SPIFFS是一种轻量级文件系统,适用于小容量存储,支持文件创建、读写和持久化保存。文章解析了配置结构体esp_vfs_spiffs_conf_t的关键参数,包括挂载路径、分区标签、最大文件打开数和自动格式化选项。初始化流程涵盖注册SPIFFS到虚拟文件系统(VFS)、挂载分区及失败处理机制。SPIFFS的核心作用是为ESP32提供持久化文件存储能力,适用于配置文件、日志记录和静态资源
2025-12-13 08:38:42
605
原创 ESP32启动HTTP服务器
本文介绍了如何在ESP32上搭建轻量级HTTP服务器的原理与实现方法。核心原理是利用FreeRTOS系统创建网络任务,绑定80端口监听请求,通过路由配置将URL路径与处理函数绑定。文章提供了完整的示例代码,实现WiFi连接后启动服务器,访问/temp获取模拟温湿度数据的功能。关键点包括:服务器配置(限制2个并发连接)、路由注册、处理函数实现等。测试方法只需在浏览器输入ESP32的IP地址加/temp路径即可验证。文中还形象地将服务器比作"网络客服",并详细说明了代码与服务器原理的对应关系
2025-12-12 07:29:12
287
原创 vscode配置ESP32-idf存在的问题
本文介绍了嵌入式开发中ESP-IDF环境配置的三种模式(快速/高级/现有设置)及其适用场景,重点分析了常见问题的解决方案:权限不足问题可通过修改安装路径权限或管理员身份运行解决;Flash分区问题需调整分区表并修改Flash大小配置;蓝牙组件缺失错误需在menuconfig中启用蓝牙功能;日志打印速度慢问题与FreeRTOS的configTICK_RATE_HZ参数设置相关。文章提供了具体操作步骤和配置建议,适合嵌入式开发者参考解决实际开发中的典型问题。
2025-12-10 07:27:37
741
原创 ESP idf常见指令
会将整个 build 目录下的内容全部删除,包括所有 CMake 的配置输出文件。下次构建项目时,CMake 会从头开始配置项目。请注意,该命令会递归删除构建目录下的 所有文件,请谨慎使用。项目配置文件不会被删除。会把构建输出的文件从构建目录中删除,从而清理整个项目。下次构建时会强制“重新完整构建”这个项目。清理时,不会删除 CMake 配置输出及其他文件。打开配置:idf.py menuconfig。
2025-12-08 21:53:25
90
原创 电能表新方案测试大纲
《电能表新方案测试大纲》摘要 本测试大纲适用于电能表产品的全面性能验证,包含基础计量、通信协议、远程升级等12项核心测试内容。测试依据GB/T17215.321-2021等国家标准,采用0.05级标准功率源等高精度设备,涵盖电压、电流、功率等电参量测量(误差≤±0.5%)、四象限无功计量、复费率功能(支持8套时段表)、需量计算等关键项目。特别设计了极端工况测试,如电压波动(80%-120%额定值)、谐波含量(3/5/7次谐波)及-40℃~150℃温度范围测试。
2025-10-25 10:07:03
946
原创 输出端口原理图分析
本文分析了两种输出端口电路的工作原理。第一种是"三极管直接驱动"型(如DO3/DO4电路),通过8050三极管的开关控制小功率负载,配合续流二极管和去耦电容实现稳定工作。第二种是"三极管驱动继电器"型(如DO1电路),利用三极管驱动HF118F继电器,实现隔离式大功率控制。两者的核心区别在于:前者适用于小功率快速响应场景,后者适合大功率隔离控制但响应较慢。两种电路均采用2kΩ基极限流电阻和1N4007续流二极管,确保三极管工作在饱和/截止状态并保护器件安全。
2025-10-10 21:45:55
891
原创 4G模组发送AT不回复
如下图所示,给电表发送AT指令会出现模组不回复的情况:主要是开机的时序图写的有点问题。下面分析一下这个问题;首先是mcu的引脚接到三极管,进而控制模块 PWRKEY,首先分析一下电路图;
2025-09-27 23:14:32
371
原创 4G模组的AT指令联网流程
NB-IoT和4G模组在物联网应用中广泛使用,通过AT指令实现通信控制。文章总结了两款4G模组(移远EC600和联通CE109)的通用AT指令操作流程,包括基础通信测试、模组信息查询、网络配置、信号检测及TCP连接建立等步骤。虽然不同厂商的指令格式可能不同,但核心流程具有通用性,可帮助工程师快速筛选有用的指令,提高开发效率。文中还提供了具体指令示例及其作用,并强调参考AT指令手册的重要性。
2025-08-28 10:51:17
1284
原创 域名、ip、DSN、URL
本文摘要: IP地址是互联网设备的唯一标识(如127.0.0.1),域名(如baidu.com)是IP的文字别名,一个域名可对应多个IP实现负载均衡,一个IP也可绑定多个域名。DNS服务器负责将域名解析为IP(如访问百度时,DNS将www.baidu.com转为119.75.218.70等IP)。URL(网址)结构为协议://域名/IP[:端口]/路径/文件(如http://safe.cloud.cn/webinfo/file/4040_v2020.bin),包含协议、域名、路径和文件名等要素,端口默认80
2025-08-27 17:25:59
909
原创 TCP通信与MQTT协议的关系
代码协作:通过函数调用链(MQTT 封装→TCP 发送,TCP 接收→MQTT 解析)实现两层协议的协同,确保数据从应用层(MQTT)到网络层(TCP)的无缝传输,适用于嵌入式设备的远程通信(如传感器数据上报、远程配置下发)。这种分层设计使代码模块化,便于维护(如更换 TCP 模块时,只需修改 drv_M26_Tcp* 函数,不影响 MQTT 逻辑),是物联网设备网络通信的典型实现。传输:调用 drv_M26_TcpSend,将 MQTT 数据包作为 TCP 字节流发送(底层通过模块的 TCP 通道)。
2025-05-30 16:53:50
1208
原创 mqtt协议连接阿里云平台
域名:iot-06z00c9p60cmk0g.mqtt.iothub.aliyuncs.com。4.通过域名,产品秘钥,设备名称,设备秘钥等信息,使智能电表连接至阿里云平台;2、首先新建产品,新建完成后,可以看到新建的产品;3、将新建的产品添加到设备中,可以查看设备的信息;
2025-05-29 17:25:02
919
原创 MQTT通信协议
4(协议名) + 1(协议版本) + 2(连接标志 + 保持连接时间) + 1(客户端 ID 长度 MSB) + 1(客户端 ID 长度 LSB) + 7(客户端 ID) = 16。:假设主题名为 “test/topic”(占 10 字节),有效载荷为 “hello mqtt”(占 11 字节),那么剩余长度为。(占 2 字节),订阅主题为 “test/topic”(占 10 字节),QoS 为 1(占 1 字节),那么剩余长度为。:设置为 “client01”,其长度为 7 字节,对应的十六进制表示为。
2025-05-26 18:02:59
789
原创 mqtt数据包举例
MQTT数据包由固定报头、可变报头和有效载荷三部分组成。以PUBLISH报文为例,固定报头标识消息类型和QoS等级,可变报头包含主题名和报文ID,有效载荷为实际数据。CONNECT报文则包含协议名、版本号和连接参数等。通过分析两个典型报文(发送"hello"消息和建立连接)的字节结构,展示了MQTT协议如何通过分层设计实现灵活通信。不同报文类型会根据功能需求调整各字段内容,但都遵循统一的三层结构框架。
2025-05-25 17:45:33
410
原创 atoi函数,sprintf函数,memcmp函数,strchar函数的具体原型,功能,返回值;以及使用方法
将字符串参数`str`转换为整数(`int`类型)。参数列表与`printf()`类似,但输出结果存储在`str`中而非标准输出。在字符串`s`中查找字符`c`的首次出现位置(包括终止符`\0`)。参数`c`被转换为`char`类型进行比较。比较两个内存块`s1`和`s2`的前`n`个字节。- 若`s1`和`s2`的前`n`个字节相等,返回0。- 若按字典序`s1`小于`s2`,返回负值。- 若按字典序`s1`大于`s2`,返回正值。- 失败:若未找到`c`,返回`NULL`- 查找字符包括终止符`\0`
2025-05-14 18:38:06
371
原创 TCP协议中的IP地址/域名
我们知道了IP地址,那么再给大家介绍一下“域名”,域名是IP地址的一个的别名,因为IP地址不方便记忆,我们为了方便记忆和交流,用我们方便记忆的字符来表示IP地址,这就是域名。它是由代表一定意义的英文单词的缩写构成,如:www.pku.edu.cn 就是北京大学主机的域名。域名是由它所属的各级域的域名和分配给该主机的名字共同构成的。如www.pku.edu.cn 顶级域名为cn表示中国,二级域名为EDU 表示组织的属性是教育,三级域名为pku 表示北京大学,www 表示主机名称(别名)。
2025-05-13 14:59:57
498
原创 电能表标准学习
1. 精度等级表示方式改变2008版:采用1级、2级、0.2S级、0.5S级等传统等级划分,仅覆盖常规计量需求。2021版:重新分级:扩展为A级(原2级)、B级(原1级)、C级(原0.5S级)、D级(原0.2S级),并新增E级(最高精度,最大误差±0.25%)。兼容国际标准:E级填补了IR46标准未覆盖的超高精度需求,同时B级的误差要求比IR46更严格。2. 电流规格定义方式改变。
2025-05-07 14:07:29
777
原创 vs2022用于上位机开发,需要下载的工作负荷包括哪些
实际选择时需结合项目具体技术栈(如是否依赖C++底层库或纯.NET框架)进行灵活调整。若需开发基于MFC或ATL的C++上位机应用,或涉及硬件底层操作(如驱动交互)时需选择。适用于使用C#开发WinForm或WPF应用程序的场景,这是上位机开发的主流框架。◦ C++ MFC和ATL支持库(勾选后可构建传统Windows桌面应用)• 安装位置建议选择非系统盘(如D盘),避免占用过多C盘空间。• .NET工业通信库(如OPC UA SDK需单独安装)• .NET Core跨平台开发(用于兼容多环境部署)
2025-04-28 10:49:26
1288
原创 电表中时控、负控、强控
时控、负控、强控构成了电表智能管理的核心逻辑,分别针对时间规划、安全防护、应急干预三大需求。实际应用中需根据场景选择组合模式(如宿舍侧重负控+时控,工商业用户注重负控+分时计费),并通过优先级设置确保系统可靠性。• 数据管理:记录跳闸事件、负荷超限次数、操作日志(如ADF400L支持30条事件存储)。• 检测阻性负载(如电炉、热得快)并跳闸,支持白名单设置(如允许饮水机)。• 总功率限制:当实际功率超过设定阈值(如企业最大负荷限制),自动断电。定义:通过预设用电时段自动控制电路通断,实现分时用电管理。
2025-04-24 14:52:33
1098
原创 Modbus TCP协议介绍、原理解析与应用示例
Modbus协议作为一种经典的通信协议,因其简单、开放和易于实现的特点,被广泛应用于各种工业设备之间的数据传输。Modbus TCP(也称为Modbus TCP/IP)是Modbus协议的一个变种,基于TCP/IP协议栈在以太网上进行通信。它继承了Modbus协议的所有优点,同时利用以太网的高带宽和稳定性,提供更快速和可靠的数据传输。客户端发起请求,服务器响应请求。与传统的Modbus RTU相比,Modbus TCP消除了串行通信的限制,支持更大的网络规模和更高的数据传输速度,适用于现代工业自动化系统。
2025-04-23 15:33:25
2481
原创 常见基础电能
示例:正向500kWh,反向200kWh → 总量700kWh(用于分析电网负荷)。组合有功总电能、正向有功总电能,反向有功总电能、正向无功总电能,反向无功总电能等参数之间的关系。• 组合有功总量(正向+反向)反映用户与电网的总交互量,用于优化发电与用电平衡。• 定义:用户从电网消耗的电能(如家庭用电、工业设备用电),方向为电网→用户。• 定义:用户向电网回馈的电能(如光伏发电余电上网),方向为用户→电网。• 无功总电能:正向与反向无功的绝对值之和,反映系统无功交换总量。
2025-04-23 14:21:12
1835
原创 DTL645协议解析【详细解析】
数据域:44 33 33 33 33 33(处理步骤:每个字节减掉0x33,分别为11 00 00 00 00 00,代表设备地址 00 00 00 00 00 11)地址域:11 00 00 00 00 00(6字节,低位在前,表示电表地址00 00 00 00 00 11)。地址域:11 00 00 00 00 00(6字节,低位在前,表示电表地址00 00 00 00 00 11)。地址域:11 00 00 00 00 00(设备地址 00 00 00 00 00 11)。
2025-04-23 10:07:33
2096
原创 STM32单片机时钟系统
在STM32中有3种不同的时钟源用来驱动系统时钟(SYSCL为什么提供这么多的时钟?节能!高速设备接高速时钟,低速设备接低速时钟,可以最大程度的达到节能效果。
2025-02-25 22:11:08
830
原创 【报数游戏】
题目要求在100个人围成一圈的情况下,进行报数,每次报到数字为M的那个人自动退出,直到剩下的人数少于M为止。我们需要找出最后剩下的人的编号。他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人数小于M。如果输入参数M小于等于1或者大于等于100,输出“ERROR!100个人围成一圈,每个人有一个编码,编号从1开始到100。否则按照原先的编号从小到大的顺序,以英文逗号分割输出编号。请问最后剩余的人在原先的编号为多少?题目描述的是一个经典的。输入一个整数参数 M。
2025-02-25 11:17:27
557
原创 TLV解码
编码是按[Tag Length Value]格式进行编码的,一段码流中的信元用Tag标识,Tag在码流中唯一不重复,Length表示信元Value的长度,Value表示信元的值。现给定TLV格式编码的码流,以及需要解码的信元Tag,请输出该信元的Value。码流以某信元的Tag开头,Tag固定占一个字节,Length固定占两个字节,输入的第二行为一个字符串,表示待解码的16进制码流,字节之间用空格分隔。给定一个16进制的码流和要查找的Tag值,要求找到对应Tag的。需要解析的信元的Tag是31,
2025-02-24 18:57:16
715
原创 3、优先级翻转问题
是当高优先级任务因等待低优先级任务占用的资源(如互斥锁)被阻塞,而中优先级任务趁机执行,导致高优先级任务无法及时运行的调度异常。:存在三个任务,优先级从高到低为。:Task_L 和 Task_H 都需要访问某个共享资源(如互斥锁MutexTask_L 获取Mutex,开始操作共享资源。Task_H 就绪,尝试获取Mutex,但发现已被占用,因此被阻塞。此时,Task_M(中等优先级)开始运行,抢占 Task_L。Task_L 因被 Task_M 抢占,无法及时释放Mutex。
2025-02-23 22:30:59
467
原创 【liunx发行版的数量】
给你一个 n * n 的矩阵 isConnected,其中 isConnected[i][j] = 1 表示第 i 个发行版和第 j 个发行版直接关联,而 isConnected[i][j] = 0 表示二者不直接相连。发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有关联的发行版。所以存在两个发行版集,发行版集中发行版的数量分别是3和1,所以输出3。Mint(3)和Ubuntu(2)相关,返回最大的发行版集中发行版的数量。输出最大的发行版集中发行版的数量。第一行输入发行版的总数量N,
2025-02-19 22:32:11
177
原创 [IPV4地址转为整数]
现以字符串形式给出一个虚拟IPv4地址,限制第1小节的范围为1128,即每一节范围分别为(1128)#(0255)#(0255)#(0~255),要求每个IPv4地址只能对应到唯一的整数上。每个小节代表一个整数,范围从0到255,但题目中特别指出第一小节的范围应为1到128。128#0#255#255,转换为32位整数的结果为2147549183(0x8000FFFF)1#0#0#0,转换为32位整数的结果为16777216(0x01000000)输入一行,虚拟IPv4地址格式字符串。
2025-02-19 21:29:31
368
原创 【AI面板识别】
AI识别到面板上有N(1 ≤ N ≤ 100)个指示灯,灯大小一样,任意两个之间无重叠。描述AI识别的指示灯的大小和位置(左上角x1,y1,右下角x2,y2),由于AI识别误差,每次别到的指示灯位置可能有差异,以4个。
2025-02-18 22:25:15
569
原创 常见的排序算法:插入排序、选择排序、冒泡排序、快速排序
步骤:1.从第一个元素开始,该元素可以认为已经被排序2.取下一个元素tem,从已排序的元素序列从后往前扫描3.如果该元素大于tem,则将该元素移到下一位4.重复步骤3,直到找到已排序元素中小于等于tem的元素5.tem插入到该元素的后面,如果已排序所有元素都大于tem,则将tem插入到下标为0的位置6.重复步骤2~5C语言实现:2、选择排序步骤:在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直
2025-02-12 16:54:03
1551
2
原创 sizeof和strlen的区别
str字符数组使用"hello bit"初始化,最终也会将'\0'放置到数组中,因此数组中总共有10个元素。3.strlen是计算字符串长度的,遇到\0结束,返回不包括\0,即如果没有\0则会计算出随机值;sizeof(str):获取数组的总大小,10个元素,每个元素占1个字节,因此总共是10个字节。strlen(str): 获取字符串中有效字符的个数,不算'\0',因此总共9个有效字符。对于sizeof来说,使用时不加()也是正确的,这样也可以说明sizeof不是函数。
2025-02-10 20:09:34
1825
原创 C语言中常见关键字(static,extern)
/ 错误:无法访问file1.c中的static全局变量。// 静态全局变量,仅在file1.c中可见。(生命周期),使其从自动存储期(函数调用结束后销毁)变为静态存储期(程序运行期间一直存在)。当你有一个全局变量定义在一个文件中,并希望在另一个文件中访问它时,你可以使用。其他源文件无法访问该变量。:用于限制全局变量的作用域,避免其他文件访问,增强模块化。// 输出: Count: 1。:仅限于定义它的源文件(文件作用域)。:与程序的生命周期相同(静态存储期)。:与程序的生命周期相同(静态存储期)。
2025-02-10 16:15:10
1255
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅