[Micropython]TPYBoardV10X教程10 使用macroSD卡
原创版权归山东萝卜科技有限公司所有,转载必须以链接形式注明作者和原始出处。
本篇重点讲述TPYBV10x板上microSD卡的操作方法。
1、引言
TPYBV10x自带microSD卡槽,可以直接插入TF卡(支持FAT/FAT32格式)使用。
如果不插入TF卡,系统将从内部flash启动,此时一切操作是对内部flash进行的。如修改main.py程序后,点击保存,TPYBV101的LED1会亮起,直到到LED1熄灭后,才说明写入成功,之所以有这么一段时间,是因为flash的写入要慢一点,如果未熄灭,即写入没成功就按下了reset键,那再次启动后,往往会出现flash里的boot.py、main.py等文件为空的情况。
如果插入TF卡,系统将检索TF卡内是否有boot.py和main.py等程序,如果有刚执行。另外,在TF卡上进行文件修改或者保存时,LED1灯不会亮起,修改完,正常退出后,就可以按reset键看程序运行结果。
另外,TPYBV10x还可以做TF卡读卡器用,速度在500KB/s左右。这里我们重点来看一下TF卡的操作。
2、TF卡路径及主要操作方法
系统分内部flash和tf卡两个路径:内部flash为/flash",TF卡的路径是"/sd" ,这里注意区分大小写。
TF的主要操作方法:
(1)最重要open函数
#open(路径+文件名,读写模式) ,如 f=open('/tmp/hello','w') #读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件。如:'rb','wb','r+b'等等
读写模式的类型有:
rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278) w 以写方式打开, a 以追加模式打开 (从 EOF 开始, 必要时创建新文件) r+ 以读写模式打开 w+ 以读写模式打开 (参见 w ) a+ 以读写模式打开 (参见 a ) rb 以二进制读模式打开 wb 以二进制写模式打开 (参见 w ) ab 以二进制追加模式打开 (参见 a ) rb+ 以二进制读写模式打开 (参见 r+ ) wb+ 以二进制读写模式打开 (参见 w+ ) ab+ 以二进制读写模式打开 (参见 a+ )
注意:(A 使用'W',文件若存在,首先要清空,然后(重新)创建,B 使用'a'模式 ,把所有要写入文件的数据都追加到文件的末尾,即使你使用了seek()指向文件的其他地方,如果文件不存在,将自动被创建。)
open的主要方法:
f.read([size]) #size未指定则返回整个文件,如果文件大小>2倍内存则有问题.f.read()读到文件尾时返回""(空字串) f.readline() #返回一行 f.readline([size]) #返回包含size行的列表,size 未指定则返回全部行 f.write("hello\n") #如果要写入字符串以外的数据,先将他转换为字符串. f.tell() #返回一个整数,表示当前文件指针的位置(就是到文件头的字节数)。 f.seek(偏移量,[起始位置]) #用来移动文件指针,偏移量:单位:字节,可正可负,起始位置:0-文件头,默认值;1-当前位置;2-文件尾。 f.close() #关闭文件
(2)其它os方法
os.chdir(path) #修改路径 os.getcwd() #获取当前路径 os.listdir(dir) #目录列表 os.mkdir(dir) #创建目录 os.remove(path) #删除文件 os.rmdir(dir) #删除目录 os.rename(old_path, new_path) #文件改名 os.stat(path) #文件/目录状态
os.sync() #同步文件 os.urandom(n) #返回n个硬件产生的随机数
注意:
(1)引用os库,import os
(2)请不要使用中文文件名和路径名
(3)文件操作后,不会立即更新到TF卡,需要从系统中安全移出磁盘后才会生效,如果不先移出磁盘,可能会丢失文件,甚至破坏TF卡上的文件系统。
3、实例
(1)向TF卡写入一个log文件,在tf卡上写入boot.py和main.py文件,修改tf卡上的main.py。代码:
import pyb pyb.LED(2).on() #打开led(2) log=open('/sd/log.txt','w') #如果无log.txt,建立log.txt,如果有,直接打开 for i in range(100): log.write("%d ok\r\n" %i) log.close() pyb.LED(2).off() #关闭led(2)
运行结果:
板子通电后,可看到led2亮起,此时开始写入log.txt文件,然后len2熄灭,说明文件操作完成。结果如下:
(2)查看文件指针位置
代码1:
# main.py -- put your code here! import pyb log=open('/sd/log.txt','w') s=log.tell() print(s)
运行结果:
为了便于查看结果,我们用putty进行REPL调试。保存好main.py后,在Putty中,按ctrl+D,显示结果如下:
>>> PYB: sync filesystems PYB: soft reboot 0 MicroPython v1.8-95-gb580958 on 2016-05-21; PYBv1.0 with STM32F405RG Type "help()" for more information.
可以看出s为0,即默认在文件头。
代码2:从文件头偏移20个比特
# main.py -- put your code here! import pyb log=open('/sd/log.txt','w') log.seek(24,0) s=log.tell() print(s) 运行结果: >>> PYB: sync filesystems PYB: soft reboot 24 MicroPython v1.8-95-gb580958 on 2016-05-21; PYBv1.0 with STM32F405RG Type "help()" for more information. 可见s=24。
(3)那么当移动24个字节后,再来写入时,会出现内容写到什么位置了?
为了便于观察,先在log.txt写入30个1,如图
代码:
# main.py -- put your code here! import pyb pyb.LED(2).on() log=open('/sd/log.txt','w') #for i in range(100): # log.write("%d ok\r\n" %i) #log.close() log.seek(24,0) s=log.tell() print(s) log.write("HH") log.close() pyb.LED(2).off()
安全退出来,点reset看运行结果:
可以看出,在第24个字节写入了HH。如果这里的open里,把w改成a,结果又会是怎样?大家自己试吧。
(4)判断文件是否存在,如果存在,删除文件
判断flash中某文件是否存在,最常用的方法是os.path.isfile(),然而试了一下发现,micropython中没有os.path,于是想到用try...except……的方法。考虑用os.stat()一个不存在的文件,利用OSError错误提示。
代码:
import pyb import os pyb.LED(2).on() try: s=os.stat('/sd/b.txt') os.remove('/sd/b.txt') print("Del file ok!") pyb.LED(2).off() except OSError: pyb.LED(3).on()
运行结果:首先亮起led(2),如果tf卡上存在文件b.txt,则删除后,LED(2)熄灭,如果不存在,LED(3)与(2)均亮起。
注意:发现如果是纯数字的文件名,好像tpyb也不认,如1.txt,运行上面的程序时,总是提示文件不存在。具体大家可以再试试。