10个版本 (重大更新)
0.8.0 | 2024年7月12日 |
---|---|
0.7.0 | 2024年2月9日 |
0.6.0 | 2023年10月20日 |
0.5.0 | 2023年5月22日 |
0.1.1 | 2018年12月23日 |
#27 in 嵌入式开发
3,252 每月下载量
用于 18 个包
265KB
5K SLoC
嵌入式SD/MMC
此包旨在允许您在Rust嵌入式设备上像使用SdFat Arduino库一样轻松地读取/写入FAT格式SD卡上的文件。它是用纯Rust编写的,是#![no_std]
,并且不使用alloc
或collections
来保持内存占用低。首先,它是为了可读性和简单性而不是性能而设计的。
使用此包
您需要某种实现BlockDevice
特质的东西,它可以读取和写入来自您的卡的512字节块(或扇区)。如果您想在USB大容量存储上实现此功能,就没有理由这个包不能与USB闪存驱动器一起工作,但我们只提供了一个适用于通过SPI读取SD和SDHC卡的BlockDevice
。
// Build an SD Card interface out of an SPI device, a chip-select pin and the delay object
let sdcard = embedded_sdmmc::SdCard::new(sdmmc_spi, delay);
// Get the card size (this also triggers card initialisation because it's not been done yet)
println!("Card size is {} bytes", sdcard.num_bytes()?);
// Now let's look for volumes (also known as partitions) on our block device.
// To do this we need a Volume Manager. It will take ownership of the block device.
let mut volume_mgr = embedded_sdmmc::VolumeManager::new(sdcard, time_source);
// Try and access Volume 0 (i.e. the first partition).
// The volume object holds information about the filesystem on that volume.
let mut volume0 = volume_mgr.open_volume(embedded_sdmmc::VolumeIdx(0))?;
println!("Volume 0: {:?}", volume0);
// Open the root directory (mutably borrows from the volume).
let mut root_dir = volume0.open_root_dir()?;
// Open a file called "MY_FILE.TXT" in the root directory
// This mutably borrows the directory.
let mut my_file = root_dir.open_file_in_dir("MY_FILE.TXT", embedded_sdmmc::Mode::ReadOnly)?;
// Print the contents of the file, assuming it's in ISO-8859-1 encoding
while !my_file.is_eof() {
let mut buffer = [0u8; 32];
let num_read = my_file.read(&mut buffer)?;
for b in &buffer[0..num_read] {
print!("{}", *b as char);
}
}
打开目录和文件
默认情况下,VolumeManager
将初始化为最大4个打开目录、文件和卷。这可以通过指定MAX_DIR
、MAX_FILES
和MAX_VOLUMES
泛型常量来自定义VolumeManager
。
// Create a volume manager with a maximum of 6 open directories, 12 open files, and 4 volumes (or partitions)
let mut cont: VolumeManager<_, _, 6, 12, 4> = VolumeManager::new_with_limits(block, time_source);
支持的功能
- 从打开的目录以所有支持的方法打开文件
- 打开任意数量的目录和文件
- 从打开的文件中读取数据
- 向打开的文件写入数据
- 关闭文件
- 删除文件
- 迭代根目录
- 迭代子目录
- 通过defmt或通用日志接口记录(功能标志)。
无std使用
本存储库没有包含无标准使用示例,但是您可以查看以下示例
待办事项列表(欢迎提交PR!)
- 创建新目录
- 删除(空)目录
- 处理MS-DOS
/path/foo/bar.txt
风格的路径。
变更日志
变更日志已移至 CHANGELOG.md
许可证
根据您的选择,许可如下
-
Apache License, Version 2.0 (LICENSE-APACHE 或 http://apache.ac.cn/licenses/LICENSE-2.0)
-
MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
版权声明存储在 NOTICE 文件中。
贡献
除非您明确声明,否则您根据Apache-2.0许可证定义的任何有意提交以包含在作品中的贡献,应按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~550–780KB
~16K SLoC