[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,运行上面的程序时,总是提示文件不存在。具体大家可以再试试。




