一、一些API

1、打开文件

SerialFlashFile file;
file = SerialFlash.open("filename.bin");
if (file)
{ // true if the file exists}

2、读数据

char buffer[256];
file.read(buffer, 256);

3、获取文件尺寸和位置

file.size();
file.position()
file.seek(number);

4、写数据

file.write(buffer, 256);

5、擦除

file.erase();

擦除文件,就是将指定文件全部内容写为255 (0xFF)

6、创建新文件

SerialFlash.create(filename, size);
SerialFlash.createErasable(filename, size);

返回值为布尔型,返回True说明创建成功,返回false说明创建失败(没有足够的可用空间)
      创建后,文件大小不可更改。

7、删除文件

SerialFlash.remove(filename);

删除文件后,其暂用的空间不会被回收,但删除后,可以再创建一个同名文件。

8、检查文件是否存在(不会打开文件)

SerialFlash.exists(filename);

9、列出文件所有信息

SerialFlash.opendir();
SerialFlash.readdir(buffer, buflen, filelen);
#ifndef SerialFlash_h_
#define SerialFlash_h_ #include <Arduino.h>
#include <SPI.h> class SerialFlashFile; class SerialFlashChip
{
public:
//两种Flash的初始化方法,一般选用第二种
static bool begin(SPIClass& device, uint8_t pin = 6);
static bool begin(uint8_t pin = 6); //通过Id来查询容量
static uint32_t capacity(const uint8_t *id);
//查询扇区大小
static uint32_t blockSize();
//睡眠以及唤醒
static void sleep();
static void wakeup();
//读取ID
static void readID(uint8_t *buf);
//读取序列号
static void readSerialNumber(uint8_t *buf);
//读Flash
static void read(uint32_t addr, void *buf, uint32_t len); static bool ready();
static void wait(); //写Flash
static void write(uint32_t addr, const void *buf, uint32_t len); //擦出
static void eraseAll();
static void eraseBlock(uint32_t addr); //打开文件
static SerialFlashFile open(const char *filename);
//创建文件
static bool create(const char *filename, uint32_t length, uint32_t align = 0);
//创建文件
static bool createErasable(const char *filename, uint32_t length) {
return create(filename, length, blockSize());
}
//文件是否存在
static bool exists(const char *filename);
//移除文件
static bool remove(const char *filename);
static bool remove(SerialFlashFile &file);
//打开文件目录
static void opendir() { dirindex = 0; } static bool readdir(char *filename, uint32_t strsize, uint32_t &filesize);
private:
static uint16_t dirindex; // current position for readdir()
static uint8_t flags; // chip features
static uint8_t busy; // 0 = ready
// 1 = suspendable program operation
// 2 = suspendable erase operation
// 3 = busy for realz!!
}; extern SerialFlashChip SerialFlash; class SerialFlashFile
{
public:
SerialFlashFile() : address(0) {
}
operator bool() {
if (address > 0) return true;
return false;
}
//读
uint32_t read(void *buf, uint32_t rdlen) {
if (offset + rdlen > length) {
if (offset >= length) return 0;
rdlen = length - offset;
}
SerialFlash.read(address + offset, buf, rdlen);
offset += rdlen;
return rdlen;
}
//写
uint32_t write(const void *buf, uint32_t wrlen) {
if (offset + wrlen > length) {
if (offset >= length) return 0;
wrlen = length - offset;
}
SerialFlash.write(address + offset, buf, wrlen);
offset += wrlen;
return wrlen;
}
//设置偏移
void seek(uint32_t n) {
offset = n;
}
//当前位置
uint32_t position() {
return offset;
}
//文件大小
uint32_t size() {
return length;
}
//是否可用
uint32_t available() {
if (offset >= length) return 0;
return length - offset;
}
//清楚
void erase();
void flush() {
}
//关闭指针
void close() {
}
uint32_t getFlashAddress() {
return address;
}
protected:
friend class SerialFlashChip;
uint32_t address; // where this file's data begins in the Flash, or zero
uint32_t length; // total length of the data in the Flash chip
uint32_t offset; // current read/write offset in the file
uint16_t dirindex;
};

二、demo

1、写文件

/*********************头文件**********************/
#include <SerialFlash.h>
#include <SPI.h> /*********************宏定义*******************/
#define File_SIZE 256 /*********************全局变量*******************/
//文件名和内容(要写的)
const char *filename = "myfile.txt";
const char *contents = "0123456789ABCDEF"; //flash指针
const int g_FlashChipSelect = 21; // digital pin for flash chip CS pin /****************创建文件如果不存在********************/
bool create_if_not_exists (const char *filename)
{
if ( !SerialFlash.exists(filename) )
{
Serial.println("Creating file " + String(filename));
return (SerialFlash.create(filename, File_SIZE));
} Serial.println("File " + String(filename) + " already exists");
return true;
} /*****************初始化函数********************/
void setup()
{
//串口配置
Serial.begin(9600);
while (!Serial) ;
delay(100);
Serial.println("Serial is OK!"); //配置Flash
if ( !SerialFlash.begin(g_FlashChipSelect) )
{
Serial.println("Unable to access SPI Flash chip");
} //创建文件指针
SerialFlashFile file; //创建文件,如果这个文件不存在
if (!create_if_not_exists(filename))
{
Serial.println("Not enough space to create file " + String(filename));
//return;
} file = SerialFlash.open(filename);
file.write(contents, strlen(contents) + 1);
Serial.println("String \"" + String(contents) + "\" written to file " + String(filename)); } void loop()
{ }

2、列出文件信息

/*********************头文件**********************/
#include <SerialFlash.h>
#include <SPI.h> /*********************宏定义*******************/ /*********************全局变量*******************/
//flash指针
const int g_FlashChipSelect = 21; // digital pin for flash chip CS pin /********************空格*******************/
void spaces(int num)
{
for ( int i=0; i < num; i++ )
{
Serial.print(" ");
}
} /*****************初始化函数********************/
void setup()
{
//串口配置
Serial.begin(9600);
while (!Serial) ;
delay(100);
Serial.println("Serial is OK!"); //配置Flash
if ( !SerialFlash.begin(g_FlashChipSelect) )
{
Serial.println("Unable to access SPI Flash chip");
} //开路径
SerialFlash.opendir(); while(1)
{
char filename[64];
unsigned long filesize; if( SerialFlash.readdir( filename , sizeof(filename) , filesize) )
{
Serial.print(" ");
Serial.print(filename);
spaces( 20 - strlen(filename) );
Serial.print(" ");
Serial.print(filesize);
Serial.print(" bytes");
Serial.println();
}
else
{
break; }
} } void loop()
{ }

3、删除全部Flash

/*********************头文件**********************/
#include <SerialFlash.h>
#include <SPI.h> /*********************宏定义*******************/ /*********************全局变量*******************/
//flash指针
const int g_FlashChipSelect = 21; // digital pin for flash chip CS pin SerialFlashFile file;
const unsigned long testIncrement = 4096; float eraseBytesPerSecond(const unsigned char *id)
{
if (id[0] == 0x20) return 152000.0; // Micron
if (id[0] == 0x01) return 500000.0; // Spansion
if (id[0] == 0xEF) return 419430.0; // Winbond
if (id[0] == 0xC2) return 279620.0; // Macronix
return 320000.0; // guess?
} /*****************初始化函数********************/
void setup()
{
//串口配置
Serial.begin(9600);
while (!Serial) ;
delay(100);
Serial.println("Serial is OK!"); // wait up to 10 seconds for Arduino Serial Monitor
unsigned long startMillis = millis();
while (!Serial && (millis() - startMillis < 10000)) ;
delay(100); //配置Flash
if ( !SerialFlash.begin(g_FlashChipSelect) )
{
Serial.println("Unable to access SPI Flash chip");
} //读ID
unsigned char id[5];
SerialFlash.readID(id);
unsigned long size = SerialFlash.capacity(id); //开路径
SerialFlash.opendir(); if( size > 0 )
{
Serial.print( "Flash Memory has ");
Serial.print( size );
Serial.println( " bytes.");
Serial.println( "Erasing All Flash Memory:"); Serial.print(" estimated wait: ");
int seconds = (float)size / eraseBytesPerSecond(id) + 0.5;
Serial.print(seconds);
Serial.println(" seconds.");
Serial.println(" Yes, full chip erase is SLOW!");
SerialFlash.eraseAll(); unsigned long dotMillis = millis();
unsigned char dotcount = 0;
while (SerialFlash.ready() == false)
{
if (millis() - dotMillis > 1000)
{
dotMillis = dotMillis + 1000;
Serial.print(".");
dotcount = dotcount + 1;
if (dotcount >= 60)
{
Serial.println();
dotcount = 0;
}
}
}
if (dotcount > 0) Serial.println();
Serial.println("Erase completed");
unsigned long elapsed = millis() - startMillis;
Serial.print(" actual wait: ");
Serial.print(elapsed / 1000ul);
Serial.println(" seconds.");
} } void loop()
{ }

Arduino101学习笔记(十四)—— Flash库的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  3. MySQL学习笔记十四:优化(1)

    SQL优化 1.查看各种SQL执行的频率 mysql> show status like 'Com_select';--Com_insert,Com_delete,connections(试图连 ...

  4. SharpGL学习笔记(十四) 材质:十二个材质球

    材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...

  5. 【转】angular学习笔记(十四)-$watch(1)

    本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...

  6. python学习笔记十四:wxPython Demo

    一.简介 wxPython是Python语言的一套优秀的GUI图形库,允许Python程序员很方便的创建完整的.功能键全的GUI用户界面. wxPython是作为优秀的跨平台GUI库wxWidgets ...

  7. angular学习笔记(十四)-$watch(1)

    本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...

  8. IDA Pro 权威指南学习笔记(十四) - 操纵函数

    IDA 无法定位一个函数调用,由于没有直接的方法到达函数,IDA 将无法识别它们 IDA 可能无法正确确定函数的结束部分,需要手动干预,以更正反汇编代码中的错误 如果编译器已经将函数分割到几个地址范围 ...

  9. Java学习笔记十四:如何定义Java中的类以及使用对象的属性

    如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...

  10. OpenCV学习笔记十四:opencv_objdetect模块

    一,简介: 该库用于目标检测.

随机推荐

  1. ACM/ICPC 之 DP-浅谈“排列计数” (POJ1037)

    这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列 ...

  2. 6. javacript高级程序设计-面向对象设计

    1. 面向对象设计 1.1 理解对象 1.1.1 属性类型 (1). 数据属性:相当于对象的字段,包含一个数据值的位置,在这个位置可以读取和写入值.数据属性中有4个描述其行为的特性: l [[Conf ...

  3. [转载]Masonry介绍与使用实践(快速上手Autolayout)

    原博地址 http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/ 前言 1 MagicNumber -> aut ...

  4. Python:IDLE清屏

    清屏很简单,为IDLE增加一个清屏的扩展ClearWindow即可. 首先下载clearwindow.py(点击可直接下载,不能下载的可以右键保存,格式为py结尾), 将这个文件放到Python安装目 ...

  5. JS 循环练习

    规律   大范围套小范围   循环   分支语句   switch case 嵌套  死循环 while(true)  打破循环   break    continue    while(true) ...

  6. dhtmlxTree介绍(转载)

    dhtmlxTree 是树菜单,允许我们快速开发界面优美,基于Ajax的javascript库. 她允许在线编辑,拖拽,三种状态(全选.不选.半选),复选框等模式.同时在加载大数据量的时候,仍然 可以 ...

  7. 【编程题目】n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始

    第 18 题(数组):题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后, ...

  8. 自定义Button 的图片设置不显示问题。

    如果你是自定义button  那么你设置图片就要用 button.imageView.image = [UIImage imageName:@""]; 如果你是给系统原生的butt ...

  9. cocos2d-x 第一篇 环境搭建

    官网:http://www.cocos2d-x.org/ 下载一个稳定版的cocos2d-x (网址:http://download.cocos2d-x.org/ Github Repository ...

  10. YAML-初识

    YAML简介 YAML-what? YAML Ain't Markup Language 和GNU一样,YAML是一个递归着说"不"的名字.不同的是,GNU对UNIX说不,YAML ...