ファイル読み書き
(→プロジェクトファイル(Harmony Ver.2.04版 ) ダウンロード)
SDカードのファイルを読み書きする例を紹介します。 Harmonyでは ロングファイル名が使用できます。
<仕様>
・SDカードに ファイルをつくり "Hellow World !!"と書き込み、これを読みだす。
詳細手順は以下とする。
① ファイルシステムをマウントする。
マウンドできたら キャラクタ液晶に"SD mounted"と表示する。
マウントできない場合は "SD notMounded"と表示する。
② ファイル名"myTestData.txt"のファイルをオープンする。ファイルが存在しない場合は新規作成する。
成功したら、キャラクタ液晶に"FileOpen_w OK !!"と表示する。
失敗した場合は "FileOpen_w failed !!"と表示する。
③ オープンしたファイルに "Hellow World !!"と書き込む
成功したら キャラクタ液晶に"Write OK !!"と表示する。
失敗したら "Write NG !!"と表示する。
④ ファイルを閉じる。
⑤ ファイル"myTestData.txt"を読み出しモードでオープンする。
失敗したら"FileOpen_r failed"と表示する。
⑥ ファイルを1バイトづつファイルエンドまで読みだす。
⑦ 開いているファイルのファイル名を取得する。
⑧ ファイルを閉じる。
⑨ 読みだした ファイルの内容とファイル名を表示する。
・ファイルのフォーマットはFAT32とする。
<回路図> (→ PDFファイル)
<外観> PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。
<動作結果> (→ 動画:1080pのHD動画を見ることができます。)
キャラクタ液晶表示 | |
①起動直後 | ![]() |
②SDカード(ファイルシステム)が マウントされているかチェック中 |
![]() |
③SDカード(ファイルシステム)が マウント完了 |
![]() |
④ファイルを書き込みモードで オープン成功 |
![]() |
⑤ファイルに書き込み成功 | ![]() |
⑥ファイルを読みだしモードで オープン成功 ファイル内容("Hellow World !!")を 読みだして上段に表示、 下段には ファイル名を表示 |
![]() |
<解説> 記載してある内容は要点だけです。 詳細はプロジェクトファイルを精読願います。
(以下は、Harmony v2.04 をもとに作成しています。最新のバージョンは異なることがあるかもしれませんので注意してください。)
■MHCの設定
■Options
■ Pin Settings
項目 | ⑨ポート設定 |
MHC | ![]() |
備考 | デフォルトからの変更要領: RF12/Function: GPIO_IN (CD用入力ポート設定) RB13/Function: GPIO_OUT (CS用出力ポート設定) RF13/Function: SDI6 (SPI6のSDI設定) RB15/Function: SDO6 (SPI6のSDO設定) RD15/Function: SCK6 (SPI6のSCK設定) |
■ キャラクタ液晶表示のライブラリ 1lcd_lib_XC32.h と 1lcd_lib_XC32.cを main.cと同じフォルダにコピーして、プロジェクトに追加します。
(詳細→ キャラクタ液晶表示方法 参照)
■ app.cに、青字部分を追加します。
① stdio.h、1lcd_lib_XC32.hのインクルード 及び所要の変数を定義します。
#include "stdio.h"
#include "1lcd_lib_XC32.h"
char Buf[17]; //液晶表示バッファー
……
……
② NOPを利用した μsec、msecの遅延関数 delay_us( )、delay_ms( )を定義します。
void delay_us(volatile unsigned int usec) //1μsec遅延
{
volatile int count;
……
……
③ 実際に SDカードを読み書きする関数SD_RW( )を作成します。
void SD_RW(void) //SDカード 挿入・ライトプロテクトチェック、及び 読み書き
{
switch(SdMode)
……
……
④ SDカードが挿入されていて、ファイルシステムがマウントされるまでSYS_FS_Moun( )が実行されます。
mmcblka1は、SDカードを表します。マウント名(ユーザが任意に命名可)の前に/mnt/は必須です。
case 0: //カード挿入検出・ライトプロテクトチェック
if(SYS_FS_Mount("/dev/mmcblka1", "/mnt/myMountName",
FAT, 0, NULL) != 0) //SYS_FS_RES_SUCCESS = 0
//SYS_FS_Mount("/dev/デバイス名", "/mnt/マウント名",
ファイルシステムタイプ, Reserved, Reserved)
// /dev/と/mnt/は、名前の前に必ずつけること
……
……
⑤ ファイルを書き込みモードでオープンします。成功すると戻り値としてファイルハンドルが返されます。ファイルが存在しない
場合は、新規にファイルが作成されます。
case 1: // ファイルを書き込みモードでオープン 但しファイルがなければ新規ファイル作成
fileHandle = SYS_FS_FileOpen("myTestData.txt", (SYS_FS_FILE_OPEN_WRITE));
if(fileHandle == SYS_FS_HANDLE_INVALID)
……
……
⑥ ファイルに文字列 Hellowを書き込みます。 正常に書き込みが行われると書き込み回数が、失敗すると-1が戻り値として
返されます。
case 2: //データの書き込み
N_Write = SYS_FS_FileWrite(fileHandle, Hellow, sizeof(Hellow));//ファイルにデータ書き込み
if(N_Write != -1) //正常な場合:書き込み回数が返ってくる
……
……
⑦ 書き込みが終わったらファイルを閉じて、今度は読み出しモードでファイルをオープンします。
case 3: //読出しファイルオープン
fileHandle2 = SYS_FS_FileOpen("myTestData.txt", (SYS_FS_FILE_OPEN_READ));
if(fileHandle2 == -1) //ファイルオープン 失敗の場合
……
……
⑧ ファイルを1バイトづつ、ファイルエンドまでよみだします。
case 4: //ファイル読出し・表示
do
{
SYS_FS_FileRead(fileHandle2, tempBuf, 1); //1バイトづつ読出し
eof = SYS_FS_FileEOF(fileHandle2); //EOFチェック
……
……
⑨ オープンしているファイルファンドルのファイル名を取得します。
SYS_FS_FileNameGet(fileHandle2, str_FileName, 32 ); //ファイル名取得
⑩ キャラクタ液晶の1行目に読み出したファイル内容を、また2行目に取得したファイル名を表示します。
lcd_cmd(0x80); //1目の先頭へ
sprintf(tempBuf3,"%s ",tempBuf2);
lcd_str(tempBuf3);
……
……
以下、app.c