SD卡存储数据读写
- 案例说明
- 数据的写入与读取
- 串口工具读取数据
- 接收数据
- CSV格式
案例说明
部分设备使用过程中需要保存大量数据到TF卡中,大部分场景拔插TF卡有不太方便。
所以本案例介绍一种使用串口工具取出设备TF卡中的数据保存在电脑中的方法。
保存格式可以自己定义,本案例介绍一下CSV文本格式。
数据的写入与读取
程序启动后网络校时一次,默认写入了一组带时间的数据。
按下自定义"KEY1"键 或者 485串口发送指令 会从485串口和USB端口各打印一次TF卡里的数据。
本案例选择485用来发送指令(同时也接收数据信息),用USB端口接收程序的log(也包含数据信息)
读取log的串口可以自己选择TTL,232,485或USB串口 (发送指令的串口和replPort 口不能是同一个 , 复用会报错)。
main.py
'''
1表示 可以,0表示不行
_____________________________________________
模式 r r+ w w+ a a+
读 1 1 0 1 0 1
写 0 1 1 1 1 1
创建 0 0 1 1 1 1
覆盖 0 0 1 1 0 0
指针在头 1 1 1 1 0 0
指针在尾 0 0 0 0 1 1
_____________________________________________
'''
import uos
import utime as time
from driver import GPIO
from driver import UART
import nw
import sntp
#案例演示用数据,真实项目直接读取传感器数值。
cTemp = 26.5
humidity = 40
light = 400
#-----------------------------------------
lengh = 0
#中断回调函数
def key1_callback(args):
#读取数据
read_from_txt()
key1.disableIrq()
key1.clearIrq()
def enable_key():
#开启中断
key1.enableIrq(key1_callback)
def read_from_txt():
global lengh
p=open('/sdcard0/filename1.csv','r')
c=p.read(lengh) #read是逐字符地读取,read可以指定参数,设定需要读取多少字符,无论一个英文字母还是一个汉字都是一个字符
# c=p.readlines() #readlines会把内容以列表的形式输出。
#c=p.readline() #readline只能读取第一行代码,原理是读取到第一个换行符就停止。
print('content in filename1.csv is:')
print('-'*30)
print(c)
writeBuf=bytearray(c)
uart2.write(writeBuf)
p.close()
print('-'*30)
def write_to_txt():
global lengh,cTemp,humidity,light
#1.将内容写入txt文件中(当sd卡中没有filename1.txt时,w模式会创建该文件)
f=open('/sdcard0/filename1.csv','a')
date,t_time = get_time()
for i in range(20):
lens = f.write("date,{},time,{},cTemp,{},humidity,{},light,{}\n".format(date,t_time,cTemp,humidity,light)) #写入传感器数据
lengh += lens #计算文本字节总长度
f.close()
def init():
#启用sd卡
uos.mountsd()
#查看sd卡中有什么文件
a = uos.listdir('/sdcard0')
l = len(a)
print(a)
for i in range(l):
if i > 0:
uos.remove('/sdcard0/'+(a[i])) #删除所有文件
print("files in sd card are:",uos.listdir('/sdcard0'))
def get_time():
t=time.localtime()
d="{:04d}-{:02d}-{:02d}".format(t[0],t[1],t[2])
t = "{:02d}:{:02d}:{:02d}".format(t[3],t[4],t[5])
return d,t
if __name__ == '__main__':
#按键
key1=GPIO(10,10)
key1.open("KEY1")
enable_key() #按键中断回调,按下按键读取数据
uart2=UART()
uart2.open("RS485")
nw.connect_network() #联网
sntp.settime() #校时
init()
#写入数据
write_to_txt()
writeBuf=bytearray('** please input $Factory **\r\n')
uart2.write(writeBuf)
while True:
readBuf=bytearray(8)
while True:
uart2.read(readBuf)
if readBuf == '$Factory':
read_from_txt()
break
else:
pass
time.sleep(1)
nw.py
import network
import utime as time
#联网状态标志
g_connect_status = False
def on_4g_cb(args):
global g_connect_status
pdp = args[0]
netwk_sta = args[1]
if netwk_sta == 1:
g_connect_status = True
else:
g_connect_status = False
def connect_network():
global Net,on_4g_cb,g_connect_status
Net = network.NetWorkClient()
g_register_network = False
if Net._stagecode is not None and Net._stagecode == 3 and Net._subcode == 1:
g_register_network = True
else:
g_register_network = False
if g_register_network:
Net.on(1,on_4g_cb)
Net.connect(None)
else:
print('network register failed')
return False
while True:
if g_connect_status:
print('network register successed')
return True
time.sleep_ms(20)
#联网状态标志位
def getNetFlag():
global g_connect_status
return g_connect_status
board.json
{
"name": "haas506",
"version": "1.0.0",
"io": {
"KEY1": {
"type": "GPIO",
"port": 44,
"dir": "irq",
"pull": "pullup",
"intMode": "rising"
},
"RS485":{
"type":"UART",
"port":2,
"dataWidth":8,
"baudRate":115200,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
}
},
"debugLevel": "ERROR",
"repl": "enable",
"replPort": 3
}
修改replport自行定义输出串口,为了方便使用可以使用3 USB打印log。(485用于发送指令,不能作为replport的log输出)
串口工具读取数据
接收数据
方法一,选择485串口发送指令(或按下KEY1键),能够接收到设备储存的数据,点击保存数据就能在串口工具目录下找到对应文件
方法二,选择USB对应串口按下"KEY1"键也能收到下面的log
CSV格式
.csv 文件默认是被Excel打开的,可以当作表格处理。将保存的TXT格式文件后缀修改为.CSV后,如下
逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本)。
使用规则
- 开头是不留空,以行为单位。
- 可含或不含列名,含列名则居文件第一行。
- 一行数据不跨行,无空行。
- 以半角逗号(即,)作分隔符,列为空也要表达其存在。
- 列内容如存在半角引号(即"),替换成半角双引号(“”)转义,即用半角引号(即"")将该字段值包含起来。
- 文件读写时引号,逗号操作规则互逆。
- 内码格式不限,可为 ASCII、Unicode 或者其他。
- 不支持数字
- 不支持特殊字符