9. プロジェクト「msd_fat11_38a」 microSD にデータ記録(FAT32 版)
9.6 プログラムの解説
9.6.3 main 関数(FAT32 でマウント)
69 : /* FAT32
でマウント */70 : if( ret == 0x00 ) {
71 : ret = mountMicroSD_FAT32();
72 : if( ret != 0x00 ) { 0
以外ならエラー73 : printf( "\n" );
74 : printf( "microSD
はFAT32
のフォーマットではありません。\n" );75 : printf( "FAT32
でフォーマットしてください。\n" );76 : printf( "(Error Code = %d)\n", ret );
77 : pattern = 99;
78 : } else {
79 : printf( "\n" );
80 : printf( "microSD
はFAT32
フォーマットです。\n" );81 : }
82 : }
83 :
87 : if( i == -1 ) { -1
なら以外ならエラー88 : printf( "microSD
から書き込み番号が読めません。\n" );89 : ret = 1;
90 : pattern = 99;
91 : } else { 92 : i++;
93 : if( i >= 10000 ) i = 1;
94 : writeMicroSDNumber( i ); /* microSD
の空き領域へ番号書き込み */95 :
96 : /* ファイル名変換 */
97 : sprintf( fileName, "test%04d.csv", i ); ファイル名変換 98 : }
99 : } 100 :
101 : /* ファイル名のセット、領域確保 */
102 : if( ret == 0x00 ) {
103 : /* ファイルのタイムスタンプセット */
104 : setDateStamp( getCompileYear( C_DATE ),
105 : getCompileMonth( C_DATE ), getCompileDay( C_DATE ) );
106 : setTimeStamp( getCompileHour( C_TIME ),
107 : getCompilerMinute( C_TIME), getCompilerSecond( C_TIME ) );
108 :
109 : /* ファイル名の確認 */
110 : printf( "ファイルを開いて、領域の確保中です。
:" );111 : for( i=0; fileName[i]!='\0'; i++ ) printf( "%c", fileName[i] );
112 : printf( "\n" );
113 :
114 : /* ファイル名のセット、領域確保 */
115 : /* 書き込みしたい時間[ms] : x = 10[ms] : 23
バイト(保存バイト数) */116 : /* 10000ms(10
秒)なら、x = 10000 * 23 / 10 = 23000 */117 : /* 結果は 512
の倍数になるように繰り上げする。 */118 : /* また、最初のメッセージ分として+512
しておく */119 : ret = writeFile( fileName, 23552 );
120 : if( ret != 0x00 ) { 0
以外ならエラー121 : printf( "ファイルが開けません。(Error Code = %d)\n", ret );
122 : pattern = 99;
123 : } else {
124 : printf( "ファイルを開きました。\n" );
125 : printf( "\n" );
126 :
127 : /* microSD
書き込み */128 : msdPrintf( "msd_fat11_38a Log Data\n" );
129 : while( checkMsdPrintf() ); // msdPrintf
処理完了待ち130 : msdPrintf( "Compile Date:" );
131 : while( checkMsdPrintf() ); // msdPrintf
処理完了待ち132 : msdPrintf( C_DATE );
133 : while( checkMsdPrintf() ); // msdPrintf
処理完了待ち134 : msdPrintf( " Time:" );
135 : while( checkMsdPrintf() ); // msdPrintf
処理完了待ち136 : msdPrintf( C_TIME );
137 : while( checkMsdPrintf() ); // msdPrintf
処理完了待ち138 : msdPrintf( "\n\nLineNo,ポート 0,ディップスイッチ\n" );
139 : while( checkMsdPrintf() ); // msdPrintf
処理完了待ち140 : }
141 : }
9.
プロジェクト「msd_fat11_38a」microSD
にデータ記録(FAT32版)70
行目~
82
行目mountMicroSD_FAT32
関数で、microSDからFAT32
情報を読み込みます。microSDがFAT32以外でフォーマットされている場合はエラーになります。Windowsなどで、FAT
32
でフォーマットしてください。85
行目~
99
行目ファイル名を連番にするために、前回書き込んだ番号を読み込み、今回の番号を保存します。
86
行のreadMicroSDNumber
関数で、microSDの空き領域から前回書き込んだファイル番号を読み込みます。
92
行で1
つ大きい値にして、今回のファイル名の番号にします。94
行のwriteMicroSDNumber
関数で、次に備えて今回の番号を保存しておきます。97
行目でfileName
配列にファイル名を設定します。今回は「test0000.csv」で、「0000」部分の数字が、書き込むたびに増えていきます。ファイル名を変えたい場合はここで変えますが、ファイル名 の長さは、8文字以内+ピリオド+拡張子3文字以内にしてください。
104
行目~
107
行目microSD
にファイルとして書き込むとき、マイコンはカレンダー情報を持っていません。そのため、ビルドしたときの日付、時刻を、microSDへ書き込むファイルの日付、時刻とします。
setDateStamp
関数で、年月日を設定します。年月日情報が保存されているC_DATE
配列は、文字列として情報を持っているので、これらを
int
型に変換する関数で変換して設定しています。setTimeStamp
関数で、時分秒を設定します。時分秒情報が保存されているC_TIME
配列は、文字列として情報を持っているので、これらを
int
型に変換する関数で変換して設定しています。110
行目~
112
行目microSD
に書き込むファイル名をprintf
文で通信ソフトに表示しています。書き込むファイル名の確認用なので、この部分は無くても構いません。
115
行目~
126
行目119
行のwriteFile
関数で、microSDに保存するファイル名と書き込む容量を指定して、FAT32領域を確保します。
今回、データの記録条件を次のようにしました。
・データ記録の間隔 … 10msごと
・データ記録数 ……… 23バイト (内容は後述します)
・データ記録時間 …… 10秒(10000ms)
microSD
に確保する容量は、次のようになります。容量=記録したい時間[ms]÷記録する間隔[ms]×1回に記録するバイト数 よって、容量は次のとおりです。
=10000÷10×23 =23000
値は、512の倍数にしなければいけません。512の倍数かどうか確かめます。
23000÷512=44
余り472
割り切れないので、512の倍数で切り上げます。また、最初に分かりやすいようにコメントを書くので その分を加えます。100文字くらいですが、最小単位は
512
なので、512を加えます。よって、512×45+512=23552
となります。ファイル名は、fileName配列に設定しているので、この配列名を
writeFile
関数の引数にします。writeFile
関数の戻り値が0
なら、microSDにファイル名の登録、容量の確保が完了です。0以外ならエラーとなります。
128
行目~
書き込むファイルの最初に、ビルドしたときの日付、時間、書き込む列の内容を書き込みます。
microSD
への書き込みにはmsdPrintf
文を使います(詳しくは後述します)。msdPrintf文で書き込んだ後、次に書き込むには、①最大時間の10ms待つ ②checkMsdPrintf 関数で書き込みが終わったか確認する の二通りの方法があります。今回は、②で確認します。