# python flash读写模块
import pyb
import json
class FlashStorage:
"""Flash存储操作类,用于在OpenMV上进行数据的持久化存储"""
def __init__(self, start_addr=0x080E0000, size=512):
"""
初始化Flash存储
参数:
start_addr: Flash存储的起始地址
size: 存储区域大小(字节) , size需为 512 的整数倍
"""
self.start_addr = start_addr
self.size = size
self.flash = pyb.Flash(start=start_addr, len=size)
def write(self, data):
"""
将数据写入Flash
参数:
data: 要存储的数据(支持序列化的类型:数字、字符串、列表、字典等)
异常:
Exception: 当数据大小超过存储区域时抛出
"""
# 序列化数据为字节流
data_bytes = json.dumps(data).encode('utf-8')
# 检查数据大小
if len(data_bytes) > self.size:
raise Exception(f"数据过大({len(data_bytes)}字节),超过Flash存储上限({self.size}字节)")
# 先擦除区域再写入
self.flash.erase(0, self.size)
self.flash.write(0, data_bytes)
return True
def read(self):
"""
从Flash读取数据
返回:
读取并反序列化后的数据,如果没有数据则返回None
"""
# 读取数据
data_bytes = self.flash.read(0, self.size)
# 处理数据
data_str = data_bytes.decode('utf-8').strip('\x00')
if data_str:
return json.loads(data_str)
return None
# 测试程序
if __name__ == "__main__":
# 创建Flash存储实例
flash_store = FlashStorage()
# 测试数据 - 三个0~255的整数
test_data = [123, 255, 0]
print(f"准备写入数据: {test_data}")
try:
# 创建Flash存储实例
flash_store = FlashStorage()
# 测试数据 - 三个0~255的整数
test_data = [123, 255, 0]
print(f"准备写入数据: {test_data}")
# 写入数据
if flash_store.write(test_data):
print("数据写入成功")
# 读取数据
read_data = flash_store.read()
if read_data is not None:
print(f"读取到的数据: {read_data}")
# 验证数据类型和值
if isinstance(read_data, list) and len(read_data) == 3:
print("数据验证:")
for i, value in enumerate(read_data):
if isinstance(value, int) and 0 <= value <= 255:
print(f" 第{i+1}个值: {value} (有效)")
else:
print(f" 第{i+1}个值: {value} (无效,不在0~255范围或不是整数)")
else:
print("读取的数据格式不正确")
else:
print("未读取到任何数据")
except Exception as e:
print(f"操作失败: {str(e)}")