【STM32单片机】FATS文件系统,写入字符串到文件,读取文件内容

news2024/11/20 15:36:55

基于正点原子的库函数版本的FATS文件系统,实现向文件写入字符串,读取文件内容,这里是指txt文件,其余文件其实也一样,读取成字节。

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "key.h"

#include "MMC_SD.h"

#include "ff.h"
#include "exfuns.h"
#include "fattester.h"
#include "malloc.h"
#include "string.h"


extern FATFS *fs[2];
extern FIL *file;          //文件1
extern UINT br, bw;         //读写变量

// 将字符串写入txt文件
void write_to_txt(const char *filename, const char *str) {
    FRESULT res;

    res = f_open(file, filename, FA_CREATE_ALWAYS | FA_WRITE);  // 打开或创建文件
    if (res != FR_OK) {
        printf("Failed to open file: %d\r\n", res);
        return;
    }

    res = f_write(file, str, strlen(str), &bw);  // 写入数据
    if (res != FR_OK) {
        printf("Failed to write file: %d\r\n", res);
        f_close(file);
        return;
    }

    res = f_close(file);  // 关闭文件
    if (res != FR_OK) {
        printf("Failed to close file: %d\r\n", res);
        return;
    }

    printf("Write successfully, %u bytes written\r\n", bw);
}

void append_to_file(const char *filename, const char *data) {
    FRESULT res;

    res = f_open(file, filename, FA_WRITE | FA_OPEN_ALWAYS);  // 打开文件
    if (res != FR_OK) {
        printf("Failed to open file: %d\r\n", res);
        return;
    }

    res = f_lseek(file, file->fsize);  // 将写入指针定位到文件末尾
    if (res != FR_OK) {
        printf("Failed to seek file: %d\r\n", res);
        f_close(file);
        return;
    }

    res = f_write(file, data, strlen(data), &bw);  // 写入数据到文件末尾
    if (res != FR_OK || bw == 0) {
        printf("Failed to write file: %d\r\n", res);
        f_close(file);
        return;
    }

    res = f_close(file);  // 关闭文件
    if (res != FR_OK) {
        printf("Failed to close file: %d\r\n", res);
        return;
    }
}

#define MAX_LINE_SIZE 100

// 动态读取txt文件的行并进行处理
void process_lines_from_txt(const char *filename) {
    FRESULT res;
    char line[MAX_LINE_SIZE];

    res = f_open(file, filename, FA_READ);  // 打开文件
    if (res != FR_OK) {
        printf("Failed to open file: %d\r\n", res);
        return;
    }

    while (f_gets(line, MAX_LINE_SIZE, file) != NULL) {  // 按行读取文件内容
        printf("%s", line);  // 打印读取的内容

        // 这里可以对每一行进行处理,例如调用其他函数进行处理

        // 读取下一行之前可以进行必要的等待或延时操作

    }

    res = f_close(file);  // 关闭文件
    if (res != FR_OK) {
        printf("Failed to close file: %d\r\n", res);
        return;
    }
}

int main(void) {
    char str[] = "Hello, world!";
    char str1[] = "\r\nHello, world!";

    u32 total, free;
    u8 t = 0;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
    delay_init();             //延时函数初始化
    uart_init(115200);        //串口初始化为9600
    exfuns_init();        //为fatfs相关变量申请内存

    LED_Init();         //LED初始化

    mem_init();            //初始化内存池


    while (SD_Initialize())                    //检测SD卡
    {

        delay_ms(200);
        LED0 = !LED0;//DS0闪烁
    }
    exfuns_init();                            //为fatfs相关变量申请内存
    f_mount(fs[0], "0:", 1);                    //挂载SD卡
    f_mount(fs[1], "1:", 1);                    //挂载FLASH.
    while (exf_getfree("0", &total, &free))    //得到SD卡的总容量和剩余容量
    {
        delay_ms(200);
        LED0 = !LED0;//DS0闪烁
    }
    //打印大小
    printf("SD卡容量:%d MB\r\nSD卡剩余容量:%d MB\r\n", total / 1024, free / 1024);

    //write_to_txt("text.txt", str);    // 写入字符串到txt文件
    //append_to_file("text.txt", str1);    // 写入字符串到txt文件
    process_lines_from_txt("text.txt");


    while (1) {
        t++;
        delay_ms(200);
        LED0 = !LED0;
    }
}

支持的文件列表:

 //文件类型列表
const u8 *FILE_TYPE_TBL[6][13]=
{
{"BIN"},			//BIN文件
{"LRC"},			//LRC文件
{"NES"},			//NES文件
{"TXT","C","H"},	//文本文件
{"MP1","MP2","MP3","MP4","M4A","3GP","3G2","OGG","ACC","WMA","WAV","MID","FLAC"},//音乐文件
{"BMP","JPG","JPEG","GIF"},//图片文件

下图是读取到的数据展示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/955210.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA 性能优化

前言 IDEA 基于JVM,是内存紧张型的应用,即使是16GB内存也很一般。 机器配置: win10 proi7-4720hq 3.2G 4c8tddr3-1600IDEA 2023.2.1 本文优化在不升级硬件的前提下使用 优化 调整JVM堆内存及GC IDEA 自身的JVM运行时配置,启动…

【日积月累】后端刷题日志

刷题日志 说说对Java的理解JAVA中抽象类和接口之间的区别Java中的泛型 和equals()的区别八种基本数据类型与他们的包装类在一个静态方法内调用一个非静态成员为什么是非法的静态方法与实例方法有何不同重载与重写深拷贝浅拷贝面向过程与面向对象成员变量与局部变量Spring框架Sp…

C++-list实现相关细节和问题

前言:C中的最后一个容器就是list,list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指…

机器学习和数据挖掘02-Gaussian Naive Bayes

概念 贝叶斯定理: 贝叶斯定理是概率中的基本定理,描述了如何根据更多证据或信息更新假设的概率。在分类的上下文中,它用于计算给定特征集的类别的后验概率。 特征独立性假设: 高斯朴素贝叶斯中的“朴素”假设是,给定…

库仑定律和场强

1、库伦定律 两个电荷相互作用的力。 力是矢量,有大小和方向。 1.1、力的大小 1.2、力的方向 在两个电荷的连线上,同种电荷相互排斥,异种电荷相互吸引。 真空,不是必要条件,修改公式中介电常数的值仍然满足库伦定律。…

环境安装:rpm安装jdk上线项目

Tomcat安装 解析域名 购买域名并配置 安装Docker yum 卸载以前装过的docker

动力节点Spring (18-19)

⼗⼋、Spring6集成MyBatis3.5 18.1 实现步骤 ● 第⼀步:准备数据库表 ○ 使⽤t_act表(账户表) ● 第⼆步:IDEA中创建⼀个模块,并引⼊依赖 ○ spring-context ○ spring-jdbc ○ mysql驱动 ○ mybatis ○ myb…

MySQL从入门到精通【进阶篇】之 主从复制详解

文章目录 0.前言1. 主从复制简介2. 主从复制的工作流程主从复制过程中的日志文件作用(Binary Log)和中继日志(Relay Log) 3. MySQL主从复制的配置4. 参考资料 0.前言 MySQL的主从复制和读写分离是数据库领域的基本概念&#xff0…

越南“李嘉诚”造车狂飙 吊打许家印

作者:积溪 快评:造车6年,车没卖多少,市值却仅次特斯拉、丰田,成为第三大汽车厂商,造神背后的越南首富潘日旺,究竟有多神奇? 真是 贾跃亭看了会窒息 许家印看了会流泪 同样是造车…

C语言:二级指针简介

二级指针简介 二级指针即为二级指针变量,用于存放一级指针变量的地址。 一级指针变量是用来存放普通变量的地址(地址其实就是一些数字),一级指针变量也是一个变量,存放普通变量地址的同时自身也是有地址的。那么一级指…

java八股文面试[多线程]——一个线程两次调用start()方法会出现什么情况

典型回答: Java 的线程是不允许启动两次的,第二次调用必然会抛出 IllegalThreadStateException,这是一种运行时异常,多次调用 start 被认为是编程错误。 通过线程的状态图,在第二次调用 start() 方法的时候&#xff…

docker-compose安装opengauss数据库

文章目录 1. docker-compose.yaml2. 部署3. 卸载4. 连接 1. docker-compose.yaml mkdir -p /root/i/docker-compose/opengauss && cd /root/i/docker-compose/opengausscat <<EOF> /root/i/docker-compose/opengauss/docker-compose.yaml version: 3 service…

在Visual Studio 2017上配置Glut

上篇 已经介绍了如何配置OpenGL&#xff0c;但缺点是每次新建一个项目时&#xff0c;都应重新安装 “nupengl.core.redist” 与 “nupengl.core” 这两个文件&#xff0c;这在有网的情况下还是可以实现的&#xff0c;但不是一个长久之计。现在介绍另一种方法&#xff0c;用Glut…

最新AI系统ChatGPT镜像源码+详细图文搭建教程/支持GPT4.0/AI绘画+MJ绘画/Dall-E2绘画/H5端/Prompt知识库/思维导图生成

一、AI系统 如何搭建部署AI创作ChatGPT系统呢&#xff1f;小编这里写一个详细图文教程吧&#xff01;SparkAi使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 1.1 程序核心功能 程序已支持ChatGPT3.5/GPT-4提问、AI绘画、Midjourney绘画&#xf…

数据集格式处理:xml转txt(亲测有用)

1.文件准备及文件夹目录展示 如上图所示: 1.images文件夹里面装的是jpg图片&#xff0c;这个不用管&#xff0c;在xml转换txt格式的时候用不到 2.主要看labels文件夹&#xff0c;这个文件夹里面装的是标签文件 train_annotations、test_annotations文件夹里面装的是xml格式的…

qt第二天

#include "widget.h" #include "ui_widget.h" #include "QDebug" Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->resize(QSize(800,600)); //使用匿名对象&#xff0c;调用重…

LabVIEW对EAST长脉冲等离子体运行的陀螺稳态运行控制

LabVIEW对EAST长脉冲等离子体运行的陀螺稳态运行控制 托卡马克是实现磁约束核聚变最有希望的解决方案之一。电子回旋共振加热&#xff08;ECRH是一种对托卡马克有吸引力的等离子体加热方法&#xff0c;具有耦合效率高&#xff0c;功率沉积定位好等优点。陀螺加速器是ECRH系统中…

leetcode18. 四数之和(java)

四数之和 题目描述nSum 双指针代码演示 上期经典 题目描述 难度 - 中等 原题链接 - 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两…

自定义域名访问任意网站

最开始动手是按照这篇博客来的&#xff1a;http://t.csdn.cn/M3wui 但这篇博客只适用于Ubuntu等通过apt命令安装应用的linux系统&#xff0c;如果是用yum方式安装的nginx和apache2&#xff0c;配置文件的位置和名字会不一样。 现在这篇博客的门槛会比上面的链接指向的更简单一些…

基于Python+OpenCV智能答题卡识别系统——深度学习和图像识别算法应用(含Python全部工程源码)+训练与测试数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境PyCharm安装OpenCV环境 模块实现1. 信息识别2. Excel导出模块3. 图形用户界面模块4. 手写识别模块 系统测试1. 系统识别准确率2. 系统识别应用 工程源代码下载其它资料下载 前言 本项目基于Python和OpenCV图像处…