第7步:开始玩SDMMC(先占个位置)
看了一下Arduino的SD卡头文件,大概的函数说明如下,樱花板的经过对比,有部分出入,先上Arduino官网上看到的:
begin()
【描述】初始化SDMMC卡,该函数会使用SPI总线及芯片选通引脚,需要注意的是芯片选通引脚应当保持输出模式,否则SD相关的函数无法工作。
【语法】SDMMC.begin()默认方式
SDMMC.begin(cspin)指定选通引脚
【返回】成功返回true,失败返回false
exists()
【描述】检测SD上是否存在某个文件或目录
【语法】SD.exists(filename)
【参数】filename--想要检测的文件名,或目录名(目录名前加'/')
【返回】存在返回true,不存在返回false
makdir()
【描述】在SD卡上创建一个目录,并可以创建中间目录或子目录如SDMMC.makdir("a/b/c")将会创建目录a,b,c
【语法】SDMMC.makdir(filename)
【参数】filename--要创建的目录的名称,子目录的话在名称前加'/'
【返回】创建成功返回1,不成功返回0
open()
【描述】打开SD卡上的文件,如果以写方式打开,如果该文件此时不存在,则会创建新文件(但如果是目录,则只能打开已存在的目录)
【语法】SDMMC.open(filepath)
SDMMC.open(filepath,mode)
【参数】filepath--要打开文件的路径,包括其所在的目录
【参数】mode--(可选项)打开文件的方式,默认的打开方式为FILE_READ,当然其参数可以是以下之一:
FILE_READ--只读方式打开文件,从文件开始处开始读;
FILE_WRITE--以可读可写的方式打开文件,从文件结束的地方开始读写
【返回】一个指向打开文件的实例对象,如果打开失败,则会指向空
remove()
【描述】从SD卡上移除一个文件
【语法】SDMMC.remove(filename)
【参数】filename--要移除的文件名称
【返回】移除成功返回true,否则返回false
rmdir()
【描述】从SD卡上移除一个目录,不过要注意该目录必须为空
【语法】SDMMC.rmdir(filename)
【参数】filename--要移除的目录名称,子目录前加'/'
【返回】移除成功返回true,否则返回false
FILE类相关函数说明
available()
【描述】检查文件中是否有可以读的有效字节
【语法】file.available()
【参数】file--一个File类的实例,由SD.open()返回
【返回】有效字节数
close()
【描述】关闭文件,并且确保写入文件的数据会被保存到SDMMC卡上
【语法】file.close()
【参数】file--由SDMMC.open()返回的File实例
flush()
【描述】确保已写入文件的数据会被保存到SDMMC卡上,当执行文件关闭操作时该函数会被自动调用。
【参数】同close()
peek()
【描述】从文件中读出一个字节(字符),文件内容指针不会指向下一个字节,也就是说,只连续调用peek(),将返回相同的数据,如果想要读下一个节字须要调用read()函数
【语法】file.peek()
【参数】同colse()
【返回】下一个字节内容,如果该字节无效则返回-1
position()
【描述】获取当前指针在文件中的位置,即将在该位置进行下一次读或写操作
【参数】同close()
【语法】file.position()
【返回】文件中的当前位置(unsigned long)
print()
【描述】向文件中写入数据(文件必须是以写的方式(FILE_WRITE)打开),打印数字时,会在文件中以字符形式显示(即会自动进行转换),且数字可定义格式
【语法】file.print(data)
file.print(data.BASE)
【参数】file--同close()
data--需要打印的数据
BASE(可选参数)--打印数字的格式,可以是二进制(BIN)、十进制(DEC)、八进制(OCT)、十六进制(HEX)
【返回】打印的总字数,但是否读取该该打印总字数由应用程序决定。
println()
【描述】向文件中输入数据,输入完数据后自动换行,除语法和换行功能有部分区别外,其余与print()相同
【语法】file.println()
file.println(data)
file.println(data,BASE)
【参数】同print()
seek()
【描述】在文件中寻找一个新的位置(该位置必须是0到文件实际大小之间)
【语法】file.seek(pos)
【参数】file--同close()
pos--要寻找的位置(unsigned long)
【返回】成功返回true,否则返回false
size()
【描述】返回文件的大小
【语法】file.size()
【参数】同close()
【返回】文件的字节数(unsigned long)
read()
【描述】读取文件中的1个字节
【语法】file.read()
【参数】同close()
【返回】下一个字节内容,如果该字节无效则返回-1
write()
【描述】往文件中写入数据
【语法】file.write(data)
file.write(buf,len)
【参数】file--同close()
data--字节(字符)或字符串首地址
len--buf中元素的个数
【返回】写入数据的个数,是否读取返回值由应用程序决定
isDirectory()
【描述】目录和文件夹是特殊的文件,调用该函数可以用于判断当前文件是否是个文件夹
【语法】file.isDirectory()
【参数】同close()
【返回】布尔值
openNextFile()
【描述】报告一个目录下的下一个文件或目录
【语法】file.openNextFile()
【参数】同close
【返回】当前路径中的下一个文件(字符型)
rewindDirectory()
【描述】该函数会使指针指向当前目录下的第一个字件,一般和openNextFile()联合使用。
【参数】同close
【返回】无
程序代码部分,参照其他进程序增加了一些测试功能:
/*GR-SAKURA Sketch Template Version: V1.01*/
/*********************************************************************
**********************************************************************/
#include <rxduino.h>
#include "sdmmc.h"
#define SD_Check_Pin 33
SDMMC TestSD;
/* 初始化部分 */
void setup()
{
pinMode(PIN_LED0,OUTPUT); //set LED0 pin output
Serial.begin(9600);//set baudrate 9600bps
pinMode(SD_Check_Pin,INPUT);
TestSD.begin();
}
/* 主循环 */
void loop()
{
/* 循环要开始需要串口输入一个命令 */
while (! Serial.available ()); //wait command from upper computer
Serial.println ("Check SDMMC Card.....\r\n");
digitalWrite (PIN_LED0, 1); //set led0 on
while(digitalRead(SD_Check_Pin) == 1);
delay(3000);/* 延时3秒再检测,相当于消抖 */
while(digitalRead(SD_Check_Pin) == 1);
Serial.println ("SDMMC Card Check Done,Please send me a command -- 's'.......\r\n");
char c = Serial.read ();/* 读取刚刚串口输入的命令 */
if(c=='r') //if receive comand 'r'
{
File myFile = TestSD.open ("eepw.txt", FILE_WRITE); //read file 'eepw.txt'
if (myFile == false)
{
//if read mmc card error.
Serial.println ("Fail to access MMC"); //send error message via uart
while (1)
{
digitalWrite (PIN_LED0, 0); //flash led0
delay(200);
digitalWrite (PIN_LED0, 1);
delay(200);
}
}
// Write
Serial.println ("Success to access MMC"); //send message via uart
myFile.println ("Hello, my MMC test successfully!"); //write text to mmc card
myFile.close ();
// Read
myFile = TestSD.open ("eepw.txt", FILE_READ);
while (myFile.available ())
{
Serial.print ((char) myFile.read ()); //read file 'eepw.txt' and send via uart
}
// Read file size
Serial.print ("File size: ");
Serial.print (myFile.size ());
Serial.print ("Bytes");
Serial.println ();
myFile.close ();
Serial.println ("? Remove the file y / n");
while (! Serial.available ());
char c = Serial.read ();
// Remove file
if (c == 'y')
{
TestSD.remove ("eepw.txt");
Serial.println ("eepw.txt has been removed");
delay (400);
}
else
{
Serial.println ("eepw.txt has not been removed");
}
Serial.println ("Please send me a command.");
}
else
{
Serial.println ("Please send me a correct command.");
}
};
注意:目前还不能直接使用刚刚格式化后的MMC卡