GR-SAKURAにはmicroSDカードが挿入できるスロットが実装されています。
初期状態のプロジェクトではSDカードの操作はできませんが、WEBコンパイラでsdmmcライブラリをインポートすることによって利用可能となります。
使用手順を簡単に書きます(説明No.とソース内コメントNo.を一致させています)。
- ヘッダファイルのインクルード
- SDMMCクラスの宣言
- FILEクラスの宣言
- SDMMCクラスの開始
- ファイルオープン
- ファイルの確認
- ファイルのクローズ
ライブラリをインポートしたらプログラム上で<sdmmc.h>をインクルードします。
FILEクラスはオブジェクトを登録する必要があるため、グローバル変数として利用するためにダミーでfalseを登録しています。File sdfile;のような記述をするとコンパイルエラーとなりますので注意してください。
グローバル領域に配置した場合、begin()は一度きりでいいのでsetup()内でいいでしょう。
SDMMCクラスでオープンしたファイルオブジェクトをFILEクラスに引き渡します。オープンモードにはFILE_READ、FILE_WRITEがあります。
ファイルオープン後は正常にファイルを開くことができたか確認します。失敗した場合、falseという特別なオブジェクトが帰ってきます。
ファイルを使用したら必ずclose()処理を行います。正しく書き込まれなかったり、内容が破壊されたり、開けなくなったりする可能性があります。
/*GR-SAKURA Sketch Template Version: V1.08*/ #include <rxduino.h> #include <sdmmc.h> /* (1) */ /* ----- System define ------ */ #define PC Serial #define DATFILE "data.dat" /* ------------------------------ Global Instance -------------------------------- */ SDMMC SD; /* (2) */ File file = SD.open(false); /* (3) */ /* ------------------------------ System Interface -------------------------------- */ void setup() { pinMode(PIN_SW, INPUT); /* SW port is input */ PC.begin(9600, SCI_USB0); /* PC UART Setting usb-vcom */ for(; digitalRead(PIN_SW) == HIGH;) ; SD.begin(); /* (4) */ } void loop() { if(digitalRead(PIN_SW) == LOW){ /* write mode, file seek check */ file = SD.open(DATFILE, FILE_READ); /* (5) */ if(file != false){ /* (6) */ PC.write("Read File\r\n"); for(; file.available();) PC.print(file.read()); PC.write("\r\n\r\n"); file.close(); /* (7) */ } /* write mode, file write */ file = SD.open(DATFILE, FILE_WRITE); /* (5) */ if(file != false){ /* (6) */ file.write("++abcde++"); file.close(); /* (7) */ } /* read mode, file seek check */ file = SD.open(DATFILE, FILE_READ); /* (5) */ if(file != false){ /* (6) */ PC.write("Re-read File\r\n"); for(; file.available();) PC.print(file.read()); PC.write("\r\n\r\n"); file.close(); /* (7) */ } delay(2000); } }
このプログラム、何をするものかというと、オープンモードによってファイルポインタの位置がどのように違うのかを確認するためのものです。
プレテストでseek()コマンドを実行すると、次のような結果になりました。
FILE_WRITEモードで開いた時、初期位置は0と言われます。この時のファイルサイズは9(元々9文字入れていました)。seek()コマンドでファイルポインタを進めても、位置は変わらず0と言われました。FILE_WRITEモードではファイルポインタは移動しないのでしょうか?
一方、FILE_READモードで開いても初期位置は0と言われます。しかしこちらはseek()コマンドを実行すると、ファイルポインタが進み、位置が8に更新されました。試しに1byte読みだすと、ファイルポインタも更新されて1byte進み、9となります。
実際に上記プログラムを動作させると、下記のようになりました。
Read Fileブロックは元々カードに書き込まれていた情報です。FILE_READモードで開くと初期位置0から始まり、read()コマンドごとに1byte読み、ファイルポインタが進んでいるとが分かります。
続いてファイルへFILE_WRITEモードで書き込みます。上書きされるのか、追記されるのかでFILE_WRITEモードのファイルポインタ初期位置が判明します。
Re-read Fileブロックで書き込んだ内容を確認すると…追記処理されていますね。FILE_WRITEモードで開くとファイルポインタは終端に来ることが確認できました。
ファイル操作を行う上で、ファイルポインタ位置は重要となります。
今回のテストではFILE_WRITEモードは追記モードとなることが分りましたので、次回以降に上書きモードが可能か検証してみたいと思います。