数码之家

 找回密码
 立即注册
搜索
查看: 310|回复: 9

[STM] 中文长文件名基本实现

[复制链接]
发表于 2024-3-21 09:49:47 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 inthsunshine 于 2024-3-22 22:23 编辑

由于显示屏比较小,目前无法完整显示,出现尾部被截断,显示字符数这个细节还没处理好,软件上已经保存完整的长文件名
1.jpg
gb2312和unicode两个字库,中文显示都依赖这2个文件
2.jpg

3.jpg

实现原理也不难,其实FAT32一整套规范都算简单,自己编写FAT32就不困难,而且还有点意思

FAT32的文件名分短文件名和长文件名两种格式,短文件名就是dos年代的8.3命名规范,超过了就以长文件名储存,其实即使字符数量没超过,比如Aa.txt, 这个文件名其实也是用长文件名保存,有点意外吧,因为出现大小写混合的情况,短文件名无法储存

长文件名也有对应的短文件名,比如ABCDEFGHIJK.txt, 其短文件名为ABCDEF~1.txt, 所以它由2部分组成,数个长文件名的目录项+1个短文件名目录项,长文件名和短文件名之间的对应关系是通过校验和来确定的;具体到中文名字,短文件名使用GBK编码(比如 数码.txt),而长文件名使用双字节的unicode编码(比如 数码之家阿.txt),所以我准备了2个字库, 长文件名包含完整的文件名+.+扩展名,而短文件名有单独的扩展名字段

工作流程大致这样:在显示文件列表之前,读取根目录(目前只测试根目录)数据区所有的目录项,剔除无效的项目(比如已删除文件,0字节文件,系统隐含文件),保存在一个结构体数组里,保存了文件名扩展名,文件长度以及开始簇号,然后搜出特定的字库文件名,获取对应的数据区的簇号,然后逐条读取结构体数组,判断是否为长文件名,如果是,从unicode文件里读取点阵数据再显示,同理,如果是短文件名,就从gb2312里读取并显示,如果需要播放,就根据保存的开始簇号,从对应簇号读取多个扇区发给DAC播放,再从FAT表里查找得到下一个簇号,再从簇里读取数据,以此类推,直到读取最后一个簇结束标志,说明文件已结束




打赏

参与人数 1家元 +60 收起 理由
家睦 + 60

查看全部打赏

发表于 2024-3-21 10:04:24 | 显示全部楼层
你就不能画字符的时候异或一下背景色吗,看着一个个黑框不觉得丑?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-21 10:11:00 | 显示全部楼层
小陆 发表于 2024-3-21 10:04
你就不能画字符的时候异或一下背景色吗,看着一个个黑框不觉得丑?

UI调整很耗时间,暂时能显示就马马虎虎吧
回复 支持 反对

使用道具 举报

发表于 2024-3-21 11:39:43 | 显示全部楼层
长文件名可以滚动显示,文件大小超过1G就按G显示,超过1M就按M显示,超过1K就按K显示,
回复 支持 反对

使用道具 举报

发表于 2024-3-22 11:00:51 | 显示全部楼层
很久之前也手搓了一个FAT32实现,现在还是觉得FATFS香
回复 支持 反对

使用道具 举报

发表于 2024-3-22 14:09:22 | 显示全部楼层
FAT16,FAT32都不难吧,刚好是整个字节,FAT12就不好办了,要前面左右各4bit凑成一个完整的。处理起来麻烦的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-22 15:32:06 | 显示全部楼层
本帖最后由 inthsunshine 于 2024-3-22 15:33 编辑
南天音乐 发表于 2024-3-22 11:00
很久之前也手搓了一个FAT32实现,现在还是觉得FATFS香

fatfs大致看了下源码,复杂多了,所以不难理解为什么fatfs占资源,它支持FAT12/FAT16这种现在几乎没人用的文件系统有何必要,不过fatfs可以支持多任务系统,但在基本上跑单任务的单片机应用,完全可以简化

自己写的,功能没fatfs强,但代码和内存使用大大减少,运行速度更快,很多时候并不需要文件系统的所有功能,只用到部分就足够
回复 支持 反对

使用道具 举报

发表于 2024-3-22 20:35:23 | 显示全部楼层
小陆 发表于 2024-3-21 10:04
你就不能画字符的时候异或一下背景色吗,看着一个个黑框不觉得丑?

哪怕补全空格也行啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-23 00:14:19 | 显示全部楼层
天臆 发表于 2024-3-22 14:09
FAT16,FAT32都不难吧,刚好是整个字节,FAT12就不好办了,要前面左右各4bit凑成一个完整的。处理起来麻烦的 ...

FAT12我都没接触过
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-24 22:35:19 | 显示全部楼层
本帖最后由 inthsunshine 于 2024-3-24 22:37 编辑

目录结构也能支持,任意层级自由往返
把子目录提到最前面显示,文件名就不排序了,不然越搞越复杂
1.png

子目录的“.”其实可以去掉不显示, ”.."用于返回上一级目录
2.png

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-28 06:28 , Processed in 0.109200 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表