spiffs分区文件系统在esp idf的创建

ESP32新手避坑指南:从零用VSCode+ESP-IDF创建分区表,搞定FAT/SPIFFS文件系统 本文详细介绍了如何在VSCode中使用ESP-IDF配置ESP32的分区表,实现FAT和SPIFFS文件系统的数据存储。从基础存储架构认知到实战配置,再到文件系统选型与性能对比,帮助开发者避免常见错误,提升物联网项目的存储效率。特别适合ESP32新手快速掌握分区表管理和文件系统应用。 阅读详情

我用的是vscdoe,为了测试一个ns4168的音频播放,我使用了spiffs分区来存储wav文件。

创建分区开始。

首先要求在配置文件中打开spiffs分区功能。

这个要拉倒最下面才看到

然后就是有时候如果配置里看不到,

REQUIRES driver spiffs  # 关键:添加 spiffs 依赖

这个是加载main目录里的cmake配置文件

如果配置文件没有选项可以通过CMakeLists设置

再下来就是把分区表设定为自定义的

分区表大家都懂,在根目录下面

内容我给个例子

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x6000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000, 1M,
spiffs,   data, spiffs,  , 3M , 

也可以指定分区地址哈

# ESP-IDF Partition Table
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,    0x4000,
otadata,  data, ota,     0xd000,    0x2000,
phy_init, data, phy,     0xf000,    0x1000,
model,    data, spiffs,  0x10000,   0xF0000,
ota_0,    app,  ota_0,   0x100000,  6M,
ota_1,    app,  ota_1,   0x700000,  6M,
spiffs,   data, spiffs,  0xD00000,  1M

类似于这种。都行。

然后最关键的一步,要在根目录下面的CMakeLists.txt添加自动烧录的配置。放在project项目后面。

# 配置 SPIFFS 自动烧录(关键代码)
spiffs_create_partition_image(spiffs data FLASH_IN_PROJECT)

这个时候在根目录下创建data文件夹,把你要的内容放进去就行了。

然后,清空项目,烧录,写个测试代码看看


// -------------------------- SPIFFS初始化 --------------------------
esp_err_t spiffs_init(void) {
    ESP_LOGI(TAG, "Initializing SPIFFS");
    
    esp_vfs_spiffs_conf_t conf = {
      .base_path = "/spiffs",
      .partition_label = NULL,
      .max_files = 5,
      .format_if_mount_failed = true
    };
    
    // 使用所有默认参数挂载SPIFFS
    esp_err_t ret = esp_vfs_spiffs_register(&conf);
    
    if (ret != ESP_OK) {
        if (ret == ESP_FAIL) {
            ESP_LOGE(TAG, "Failed to mount or format filesystem");
        } else if (ret == ESP_ERR_NOT_FOUND) {
            ESP_LOGE(TAG, "Failed to find SPIFFS partition");
        } else {
            ESP_LOGE(TAG, "Failed to initialize SPIFFS (%s)", esp_err_to_name(ret));
        }
        return ret;
    }
    
    size_t total = 0, used = 0;
    ret = esp_spiffs_info(NULL, &total, &used);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get SPIFFS partition info (%s)", esp_err_to_name(ret));
        esp_vfs_spiffs_unregister(NULL);
        return ret;
    }
    
    ESP_LOGI(TAG, "SPIFFS initialized, total: %d, used: %d", total, used);
    return ESP_OK;
}

// 在代码中添加列出文件的测试函数
void AudioCodec::list_spiffs_files() {
    DIR *dir = opendir("/spiffs");
    if (dir == NULL) {
        ESP_LOGE(TAG, "Failed to open directory");
        return;
    }

    struct dirent *ent;
    while ((ent = readdir(dir)) != NULL) {
        ESP_LOGI(TAG, "File: %s", ent->d_name);
    }
    closedir(dir);
}

如果有内容,说明ok了。

调用就直接调用

    // 1. 打开WAV文件
    FILE *wav_fp = fopen(wav_path, "rb");
    if (!wav_fp) {
        ESP_LOGE(TAG, "无法打开文件: %s", wav_path);
        return ESP_FAIL;
    }

    // 2. 获取文件总大小
    fseek(wav_fp, 0, SEEK_END);
    size_t total_size = ftell(wav_fp);
    rewind(wav_fp);

------------------------------------------------------------

我贴出来整个音频测试项目文件。

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/i2s_std.h"
#include "driver/gpio.h"
#include "esp_err.h"
#include "esp_log.h"
#include "sdkconfig.h"
#include "esp_vfs.h"
#include "esp_spiffs.h"  // 添加SPIFFS支持

// -------------------------- 配置参数(根据硬件修改) --------------------------
#define TAG             "WAV_PLAYER"
#define I2S_BCLK        GPIO_NUM_15  // I2S时钟线引脚
#define I2S_WS          GPIO_NUM_16  // I2S声道选择线(LRCK)引脚
#define I2S_DOUT        GPIO_NUM_7   // I2S数据输出引脚
#define PLAY_BUFFER_SIZE 2048        // 播放缓冲区大小(2KB,可按需调整)
#define WAV_SAMPLE_RATE 16000        // 目标WAV采样率(16kHz,需与播放文件匹配)
#define WAV_BIT_DEPTH   16           // 目标WAV位深(16bit,需与播放文件匹配)

// 全局I2S播放通道句柄(供初始化和播放任务共用)
static i2s_chan_handle_t tx_chan = NULL;


// -------------------------- I2S初始化(仅播放配置) --------------------------
/**
 * @brief 初始化I2S硬件(适配16kHz/16bit WAV播放)
 * @return ESP_OK: 成功;其他: 失败
 */
esp_err_t ns4168_init(void) {
    // 1. 配置I2S播放通道(主模式)
    i2s_chan_config_t tx_chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_AUTO, I2S_ROLE_MASTER);
    esp_err_t err = i2s_new_channel(&tx_chan_cfg, &tx_chan, NULL);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "Failed to create I2S TX channel: %s", esp_err_to_name(err));
        return err;
    }

    // 2. 配置I2S标准模式(适配16kHz/16bit/立体声,若WAV是单声道需修改SLOT_MODE)
    i2s_std_config_t std_cfg = {
        .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(WAV_SAMPLE_RATE),  // 采样率匹配WAV文件
        .slot_cfg = I2S_STD_MSB_SLOT_DEFAULT_CONFIG(
            I2S_DATA_BIT_WIDTH_16BIT,  // 位深匹配16bit
            I2S_SLOT_MODE_MONO       // 若播放单声道WAV,改为I2S_SLOT_MODE_MONO
        ),
        .gpio_cfg = {
            .mclk = I2S_GPIO_UNUSED,  // 多数音频放大器无需MCLK,按需启用
            .bclk = I2S_BCLK,
            .ws = I2S_WS,
            .dout = I2S_DOUT,
            .din = I2S_GPIO_UNUSED,   // 播放无需输入,禁用DIN引脚
            .invert_flags = {
                .mclk_inv = false,
                .bclk_inv = false,
                .ws_inv = false,
            },
        },
    };

    // 3. 初始化I2S模式并启用通道
    err = i2s_channel_init_std_mode(tx_chan, &std_cfg);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "Failed to init I2S std mode: %s", esp_err_to_name(err));
        return err;
    }

    ESP_LOGI(TAG, "I2S init success (16kHz/16bit)");
    return ESP_OK;
}


// -------------------------- WAV播放任务 --------------------------
/**
 * @brief 读取WAV文件并通过I2S播放
 * @param args: WAV文件路径(SPIFFS中的路径)
 */
static void i2s_play_task(void *args) {
    const char *wav_path = (const char *)args;
    if (wav_path == NULL || tx_chan == NULL) {
        ESP_LOGE(TAG, "Invalid play params (path=%p, tx_chan=%p)", wav_path, tx_chan);
        vTaskDelete(NULL);
        return;
    }

    // 1. 分配播放缓冲区(栈外分配,避免栈溢出)
    uint8_t *play_buf = (uint8_t *)malloc(PLAY_BUFFER_SIZE);
    if (play_buf == NULL) {
        ESP_LOGE(TAG, "Failed to malloc play buffer (%d bytes)", PLAY_BUFFER_SIZE);
        vTaskDelete(NULL);
        return;
    }
    memset(play_buf, 0, PLAY_BUFFER_SIZE);

    // 2. 打开WAV文件(从SPIFFS读取)
    FILE *wav_fp = fopen(wav_path, "rb");
    if (wav_fp == NULL) {
        ESP_LOGE(TAG, "Failed to open WAV file: %s", wav_path);
        free(play_buf);
        vTaskDelete(NULL);
        return;
    }
    ESP_LOGI(TAG, "Open WAV file success: %s", wav_path);

    // 3. 跳过WAV文件头(标准WAV头为44字节,若文件有扩展头需调整)
    fseek(wav_fp, 44, SEEK_SET);

    // 4. 启用I2S播放通道并开始播放
    esp_err_t err = i2s_channel_enable(tx_chan);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "Failed to enable I2S channel: %s", esp_err_to_name(err));
        fclose(wav_fp);
        free(play_buf);
        vTaskDelete(NULL);
        return;
    }

    size_t read_bytes = 0;   // 从文件读取的字节数
    size_t written_bytes = 0;// I2S实际写入的字节数
    ESP_LOGI(TAG, "Start playing WAV...");

    // 循环读取WAV数据并播放
    while (1) {
        // 从文件读取数据到缓冲区
        read_bytes = fread(play_buf, 1, PLAY_BUFFER_SIZE, wav_fp);
        if (read_bytes == 0) {
            ESP_LOGI(TAG, "End of WAV file (read all data)");
            break;
        }

        // 将缓冲区数据通过I2S发送(阻塞等待发送完成)
        err = i2s_channel_write(tx_chan, play_buf, read_bytes, &written_bytes, portMAX_DELAY);
        if (err != ESP_OK) {
            ESP_LOGE(TAG, "I2S write failed: %s", esp_err_to_name(err));
            break;
        }

        ESP_LOGD(TAG, "Play progress: read=%d bytes, written=%d bytes", (int)read_bytes, (int)written_bytes);

        // 若读取的字节数小于缓冲区大小,说明文件已读完
        if (read_bytes < PLAY_BUFFER_SIZE) {
            ESP_LOGI(TAG, "Partial buffer read, play complete");
            break;
        }
    }

    // 5. 播放完成,清理资源
    i2s_channel_disable(tx_chan);  // 禁用I2S通道
    fclose(wav_fp);                // 关闭WAV文件
    free(play_buf);                // 释放缓冲区
    ESP_LOGI(TAG, "WAV play task finished");

    vTaskDelete(NULL);
}

// -------------------------- SPIFFS初始化 --------------------------
esp_err_t spiffs_init(void) {
    ESP_LOGI(TAG, "Initializing SPIFFS");
    
    esp_vfs_spiffs_conf_t conf = {
      .base_path = "/spiffs",
      .partition_label = NULL,
      .max_files = 5,
      .format_if_mount_failed = true
    };
    
    // 使用所有默认参数挂载SPIFFS
    esp_err_t ret = esp_vfs_spiffs_register(&conf);
    
    if (ret != ESP_OK) {
        if (ret == ESP_FAIL) {
            ESP_LOGE(TAG, "Failed to mount or format filesystem");
        } else if (ret == ESP_ERR_NOT_FOUND) {
            ESP_LOGE(TAG, "Failed to find SPIFFS partition");
        } else {
            ESP_LOGE(TAG, "Failed to initialize SPIFFS (%s)", esp_err_to_name(ret));
        }
        return ret;
    }
    
    size_t total = 0, used = 0;
    ret = esp_spiffs_info(NULL, &total, &used);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get SPIFFS partition info (%s)", esp_err_to_name(ret));
        esp_vfs_spiffs_unregister(NULL);
        return ret;
    }
    
    ESP_LOGI(TAG, "SPIFFS initialized, total: %d, used: %d", total, used);
    return ESP_OK;
}

// 在代码中添加列出文件的测试函数
void list_spiffs_files() {
    DIR *dir = opendir("/spiffs");
    if (dir == NULL) {
        ESP_LOGE(TAG, "Failed to open directory");
        return;
    }

    struct dirent *ent;
    while ((ent = readdir(dir)) != NULL) {
        ESP_LOGI(TAG, "File: %s", ent->d_name);
    }
    closedir(dir);
}

// -------------------------- 主函数 --------------------------
void app_main(void) {
    // 1. 初始化SPIFFS文件系统
    esp_err_t spiffs_err = spiffs_init();
    if (spiffs_err != ESP_OK) {
        ESP_LOGE(TAG, "SPIFFS init failed, exit app");
        return;
    }

    // 2. 初始化I2S播放硬件
    esp_err_t init_err = ns4168_init();
    if (init_err != ESP_OK) {
        ESP_LOGE(TAG, "I2S init failed, exit app");
        return;
    }

    list_spiffs_files();  // 列出 SPIFFS 中的文件

    // 3. 启动播放任务(使用SPIFFS中的文件路径)
    const char *target_wav = "/spiffs/hi_idf_audio.wav";  // SPIFFS中的WAV文件路径
    xTaskCreate(i2s_play_task, "i2s_play_task", 4096, (void *)target_wav, 5, NULL);
}

26-ESP32-S3 的 FLASH分区表以及 SPIFFS 文件系统 和spiffsgen.py工具 前面铺垫了这么多,存储有了,哪怎么使用这些空间呢,这就需要文件管理系统了,在我们的windows电脑里有NTFS文件系统,在安卓手机里有F2FS 文件系统,而对于ESP32有SPIFFS文件系统。SPIFFS(Serial Peripheral Interface Flash File System)是 ESP32-S3 的内存管理系统。更具体地说,它是一种在你的 ESP32 关机后不会擦除的内存存储。你可以使用它进行数据记录,保存访问代码,存储文件,以及记住用户输入的设置。SPIFFS有以下特性和用处。 阅读详情

相关推荐

ESP32 学习笔记(二十四)SPIFFS 文件系统

SPIFFS是一个文件系统,用于嵌入式目标上的SPI NOR闪存设备。它支持磨损均衡,文件系统一致性检查等。

InfiniteYuan 1万+

ESP32 SPIFFS文件系统

本章涉及知识点:ESP32 SPIFFS文件系统、日志输出。ESP-IDF版本:V5.1.2。

weixin_56073998的博客 2165

ESP32上的SPIFFs文件系统

SPIFFS 是一个用于 SPI NOR flash 设备的嵌入式文件系统,支持磨损均衡、文件系统一致性检查等功能。要使用SPIFFS进行存储时,需要新建立一个分区,指定type = data,子类型Subtype = spiffs,表示此分区用于spiffs存储。

weixin_68768619的博客 1812

spiffs入门(基于ESP-IDF)

这里对SPIFFS的一些特性进行补充: 1.以ESP32-S3为例,不算上PSRAM,仅有512kSRAM。 3.这里注意它是一个类posix接口,在menuconfig lvgl配置时遇到过对多种接口的选择。 4.NOR是逻辑门电路中的“或非”门,与之相对应的是NAND“与非门”。NOR Flash的非易失性、超高读取速度、可片上执行、写入速度慢以及价格昂贵等独特的特性决定了NOR Flash不适合做大容量存储。 1.这里说SPIFFS只有一级目录,比如创建/spiffs/tmp/myfile.txt不

qq_40773212的博客 2084

ESP32-IDF SPIFFS镜像构建与一键烧录实战

本文详细介绍了ESP32-IDF开发中SPIFFS文件系统的镜像构建与一键烧录实战。通过分区表配置、镜像生成工具使用和CMake工程集成,实现高效管理网页资源、配置文件等非易失数据。重点讲解了spiffsgen.py和spiffs_create_partition_image两种镜像构建方法,以及自动化烧录流程,帮助开发者提升嵌入式存储管理效率。

vulkan6gpu的博客 809

ESP-IDF 进阶:实现自定义分区(如 www 分区)的 OTA 更新【转公众号】

在ESP-IDF里面默认只对OTA分区的升级,但是实际项目中往往也需要对参数分区做升级更新,比如。其他步骤基本相同,你只需要修改分区表的 subtype 为。,请确保安装了对应的 ESP-IDF 工具链。使用 SPIFFS 文件系统,你可以使用。如果你的 ESP-IDF 环境没有。中的 subtype 参数。

黑压压AiKoder 1188

学习笔记ESP32——lvgl 文件系统 spiffs 移植和使用(3)

lvgl 文件系统 spiffs 移植和使用

Jeremyrev的博客 3964

从SPIFFS到WebSocket:ESP32如何用文件系统优雅地托管动态网页

本文详细介绍了如何利用ESP32的SPIFFS文件系统托管网页资源,并通过WebSocket实现多客户端实时通信。结合ESP-IDF开发框架,展示了从文件系统部署到Web服务器构建的完整流程,为嵌入式Web开发提供高效解决方案。

docker7nomad的博客 1070

esp32-idf spiffs以及文件镜像于烧录

SPIFFS(Serial Peripheral Interface Flash File System)是一个为 SPI NOR 闪存设计的嵌入式文件系统,专为资源受限的嵌入式系统优化。它被广泛应用于 ESP32/ESP8266 等 IoT 设备中管理非易失性存储数据主要应用场景:1.配置文件存储:保存 Wi-Fi 凭证、设备参数等关键配置信息2.Web资源驻留:存储网页模板、JavaScript/CSS 文件等 HTTP 服务器资源2。

Mars_3的博客 2760

ESP-IDF中SPIFFS文件系统工程实践指南

SPIFFS是一种面向NOR Flash优化的轻量级嵌入式文件系统,基于磨损均衡与掉电安全设计,广泛应用于ESP32等资源受限MCU平台。其核心原理是在Flash物理擦写特性(如4KB扇区、非覆盖写)与POSIX标准接口之间构建可靠抽象层。技术价值体现在低RAM占用、无需外部RAM缓存、支持断电恢复等关键能力,适用于固件配置存储、传感器日志记录、Web服务器静态资源托管等典型场景。本文围绕分区表配置、VFS挂载、健康检查(spiffs_check)、空间探查(spiffs_info)及标准I/O实战展开,深

weixin_42298164的博客 358

ESP32-IDF开发实例-SPIFFS数据存取

ESP32-IDF对SPIFFS提供了非常好的支持。ESP32-IDF还提供专门的工具,如spiffsegn,mkspiffs等,对在ESP32上进行格式化,分区提供良好的支持。 本次实例将通过对SPIFFS接口的调用演示,从而实现数据的存取。

视觉与物联智能 2216

ESP32入门-移植spiffs到目标项目

ESP32

tianya 900

别再死记硬背了!用Python+Matlab/Simulink手把手带你理解PID控制器的‘稳、快、准’

本文通过Python编程和Matlab/Simulink仿真,深入解析PID控制器的‘稳、快、准’三大核心指标,帮助读者直观理解PID控制的实现原理与参数整定技巧。内容涵盖经典控制理论和自动控制原理,提供实战案例和高级调参技巧,适合工业自动化领域的学习者和工程师。

weixin_42551227的博客 368

SOC-ESP32S3部分:23-文件系统

通过设置这些参数,可以控制 SPIFFS 文件系统的挂载行为、分区选择、最大同时打开的文件数以及挂载失败时的处理方式。spiffs_create_partition_image 是一个用于将文件系统中的文件打包成 SPIFFS 镜像并烧录到 ESP32 Flash中的命令,可以在程序烧录阶段一同将自定义的SPIFFS 文件镜像烧录到开发板。NVS 可以存储一些 PHY 初始化数据,也可以存储其他数据,一些断电存储的数据建议放在这里。同理,因为文件系统需要用到Flash存储,所以也得进行分区表的创建。

嵌入式成长手册 2049

DEM数据下载,拼接,裁剪

目录: 1、数字高程模型(DEM)的数据下载 2、在ENVI里面进行拼接,生成SARscape标准格式的DEM数据3、在ArcGIS里面安装已有的矢量范文,进行掩膜裁剪 4、注意事项 数字高程模型的数据下载: 网址:http://dwtkns.com/srtm30m/ 1.对研究区域进行经纬度选择,然后进行选择下载即可 2.下载的数据是.hgt格式的,按照不同的需求进行转换,这里我是用于ENVI处理,且下载了四个,所有进行了拼接,拼接、格式转换如下 注:可能有时候需要登陆注册,点击下...

weixin_40874151的博客 2万+

西门子1500T系列凸轮同步(CAMIN指令用法)

添加凸轮工艺对象(TO_CAM),也就是凸轮表。开始编程,先写2个轴的使能、回原点与主轴的定位。监控主轴与从轴的位置、速度关系是否满足实验要求。1.添加工艺对象(1个定位轴,1个同步轴)调用CAMIN指令 ,凸轮耦合。主轴为旋转轴且为模数轴。3.调用插补凸轮盘指令。4.仿真、监控、调试。

gyxgyx789的博客 1万+

mkspiffs 使用指南:ESP32文件系统构建工具

mkspiffs 是一个用于创建嵌入式系统中SPI Flash File System(SPIFFS)映像文件的工具,专为ESP32等微控制器项目设计。这个开源工具允许用户将主机上的文件结构编译成适合加载到MCU闪存特定分区的二进制映像。 ## 快速开始 ### 环境准备 确保你的开发环境已安装Git、编译工具等基本组件,特别是在Windows上可能还需要MSYS2或类似环境以支持Unix-

gitblog_00043的博客 1028

GD32F470实战:如何用EXMC+SDRAM为LVGL打造超大内存池(附完整配置代码)

本文详细介绍了如何利用GD32F470的EXMC接口与SDRAM深度整合,为LVGL构建高性能内存解决方案。通过硬件架构设计、EXMC接口配置、高级内存管理策略及LVGL性能优化技巧,开发者可以突破微控制器内存限制,实现高分辨率显示和复杂动画效果。附完整配置代码,助力嵌入式GUI开发。

rrr55的博客 546

VSCode+ESP-IDF:ESP32嵌入式开发环境搭建与高效工作流实战

在嵌入式系统开发中,集成开发环境(IDE)和底层开发框架的选择直接影响开发效率和项目质量。其核心原理在于通过工具链、构建系统和调试器的紧密集成,为开发者提供从代码编写到硬件部署的完整解决方案。这种技术组合的价值在于平衡了底层硬件控制能力与现代化开发体验,特别适用于物联网(IoT)设备、智能硬件等对功耗、实时性和外设控制有严格要求的场景。以ESP32系列芯片为例,乐鑫官方提供的ESP-IDF框架结合Visual Studio Code编辑器,构成了当前主流的开发方案。该方案通过自动化环境配置、智能代码补全和一

weixin_28285943的博客 216

Python爬虫实战:股票历史数据抓取与量化回测全流程详解

我们以**东方财富网(eastmoney.com)和雪球网(xueqiu.com)**为主要目标,演示如何爬取A股历史行情。最常用的HTTP请求库,简单易用,适合静态页面数据请求。本文详细介绍了从股票历史数据抓取到简单回测的完整流程,代码示例基于最新技术,结构清晰,适合初学者和进阶者学习量化投资实战。希望对你入门Python爬虫和量化交易有所帮助!

2201_76125261的博客 1778

大模型系列——Ollama简明教程

在这篇文章中,我们将了解如何使用 Ollama、如何在 Ollama 中创建自己的模型 以及如何使用 Ollama 构建聊天机器人。这是深入研究 Ollama 的第一部分,以及我所学到的有关本地 LLM 的知识以及如何将它们用于基于推理的应用程序。在这篇文章中,你将了解——

2401_84052244的博客 1万+

ESP-LittleFS 项目常见问题解决方案

ESP-LittleFS 项目常见问题解决方案 1. 项目基础介绍和主要编程语言 ESP-LittleFS 是一个针对微控制器的轻量级、可靠的文件系统。它被移植到 ESP-IDF(特别是 ESP32)上,原因在于 SPIFFS 文件系统速度较慢,而 FAT 文件系统过于脆弱。ESP-LittleFS 能够为微控制器提供高效、稳定的文件存储解决方案。 该项目主要使用 C 语言进行开发,这是因为在嵌入...

gitblog_01196的博客 1227

SAP_FICO模块-资产减值功能对折旧和残值的影响

SAP_FICO模块-资产减值操作对资产历史折旧以及后续折旧的影响,包括减值操作的配置前提

风沙的博客 2804

[ESP32 IDF] 构建高性能Web Server:从分区表设计到SPIFFS文件系统实战

本文详细介绍了如何在ESP32 IDF框架下构建高性能Web Server,涵盖分区表设计、SPIFFS文件系统配置及实战应用。通过优化内存管理和并发连接,实现高效的网页文件托管与硬件控制,为物联网设备提供稳定的Web交互解决方案。

lemon的博客 1087

2026从0到1!C#工控机开发实战指南:新手一周就能跑通的完整项目

这篇文章摘要如下: 工业自动化领域工控机开发入门指南,针对零基础开发者提供从环境搭建到项目实战的全流程指导。文章首先解答工控机开发的3个核心问题,比较工控机与普通PC的区别,推荐使用C#作为开发语言。随后详细讲解开发环境配置、四大核心技术栈(通信协议、数据库、UI框架、多线程),并重点演示Modbus TCP通信的实现。最后通过一个完整的温度监控系统项目实战,展示如何用WPF构建实时数据采集界面,包括Modbus通信类编写、数据采集服务实现等关键代码片段。全文采用图解+代码的方式,帮助开发者快速掌握工控系统

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 702

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ESP-IDF 分区表详细说明

ESP32 使用 Flash 存储固件、参数、文件系统等数据。分区表通过描述每一部分的起始地址、大小和类型,指导固件如何存取数据,本文详细介绍了分区表相关内容。

qq_41946744的博客 2213

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: VideoDownloadHelper下载视频插件
下一篇: espidf SPIFFS 文件系统使用的一个注意事项
CDialog
博客等级 码龄23年 245粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CDialog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值